PASCAL 3
Integriertes
Pascal-Compilersystem
AMIGA
MaxonPASCAL
Integriertes Pascal-Compilersystem
MAXOfI
fcomputer
MaxonPASCAL 3
Autoren:
Compiler: Jens Gelhar
Editor: Thomas E. VWeger
Units/Includes: Jürgen Schmitz
© 1989-94 MAXON Computer GmbH
Alle Rechte Vorbehalten. Dieses Handbuch und die dazugehörige Software ist urheberrechtlich
geschützt. Es darf in keiner Form (auch auszugsweise) mittels ii^endwelcher Verfahren
reproduziert, gesendet, venaelfaitigt bzw. verbreitet oder in eine andere Sprache übersetzt
werden.
Bei der Erstellung des Programmes, der Anleitung sowie Abbildungen wurde mit allergrößter
Sorgfalt vorgegangen. Trotzdem können Fehler nicht ausgeschlossen werden. MAXON
übernimmt keinerlei Haftung für Schäden, die auf eine Fehlftmktion von Programmen
zurückzuführen sind.
Alle Informationen, die in der vorliegenden Anleitung enthalten sind, werden ohne Rücksicht
aut einen eventuellen Patentschutz veröffentlicht. Ebenso werden Warenzeichen ohne
Gewährleistung einer freien Verwendung benutzt.
Support
Bei Fragen zu MaxonPASCAL 3 wenden Sie sich bitte an:
MAXON Computer GmbH
“MaxonPASCAL 3 Support”
Po.stfach 5969
65734 Eschborn
Copyrights und Warenzeichen:
Commodore® und Amiga® sind eingetragene Warenzeichen der Commodore-
Amiga Inc.
AmigaDOS “, Kickstart'“, Intuition” und Workbench” sind Warenzeichen der
Commodore-Amiga Inc.
Amiga Workbench”ist ein Copyright der Commodore Amiga inc.
MAXON® ist ein eingetragenes Warenzeichen der MAXON Computer GmbH
MAXON Software-Lizenzbedingungen
1 AllKemeines
Gegenstand dieses Venrages isl das Benulzungsreehl l'tir MAXON Compulerprogrammc, lürdie Benutzungsanleilung
sowie für sonstiges zugehöriges schrit'tliehes Material, nachfolgend zusarnmenfassend als Software bezeichnet.
2 VerviellaltiBungsreehle
(1) Der Anwender darf das gelieferte Programm vervielfältigen, soweit die jeweilige Vervielfältigung für die Benutzung
des Programms notwendig ist. Zu den notwendigen Vervielfältigungen zählen die Installation des Programms vom
Originaldateniräger auf den Massenspeieher der eingesetzten 1 lardware .sowie das Laden des Programms in den
Arheit.sspeicher.
(2) Darüber hinaus kann der Anwender eine Vervielfältigung zu Sicherungsz.wecken vornehmen. Es darf jedoch jeweils
nur eine einzige Sicherungskopie angefertigt und aufliewahrt werden. Diese Sieherangskopie ist als solche des überlasse¬
nen Programms zu kennzeichnen.
(31 Weitere Verviellaltigungen. zu denen auch die Ausgaiie des Programmcodes auf einen Drucker sowie das
Fotokopieren des Handbuchs zählen, darf der Anwender nicht anfertigen.
3 Melirfiielinulzungen und Netzwerkeinsatz
(1) Der Anwender darf die Software auf jeder ihm zur Verfügung stehenden Hardware einselzen. W/echsell der
Anwender jedoch die Hardware, muß er die Software vom Massenspeieher der bisher verwendeten Hardware löschen.
Bin zeitgleiches Einspeiehem, Vorrälighalten oder Benutzen auf mehr als nur einer Hardware ist unzulässig.
(2) Der Einsatz der überlassenen Software innerhalb eines Netzwerkes oder eines sonstigen Mehrstations-Rechensy.stems
ist unzulässig, sofern damit die Möglichkeit zeitgleicher Mehrfuchnulzung des Programms geschaffen wird. Möchte der
Anwender die Software innerhalb eines Netzwerkes oder sonstiger Mehrstations-Rechensystemc einsetzen, muß er eine
zeitgleiche Mchrlächnutzung durch Zugriffsschutzmechanismen unterbinden oder an den Lieferanten eine besondere
Netzwerkgebuhr entrichten, deren Höhe sich nach der Anzahl der an das Rechensystem ange.schlossenen Benutzer
bestimmt.
(3) Die im Einzelfall zu entrichtende Netzwerkgebühr wird dem Anwender von dem Lielerant umgehend mitgeteilt.
sobald der Anwender dem Lieferanleii den geplanten Netzwerkeinsatz, einschließlich der Anzahl angeschlossener
Benutzer schriftlich bekanntgegeben hat. Unsere Anschrift ist dem Benutzerhandbuch zu entnehmen. Der Einsatz, iin
Netzwerk isl erst nach der vollständigen Entrichtung der Netzwerkgebühr zulässig.
4 Weiterveräullening
(1) Der Anwender darf die Software einschließlich des Benutzerhandhuchs und des sonstigen Begleitmaterials auf Dauer
an Dritte veräußern oder verschenken, vorausgesetzt, der erwerbende Drille erklärt sich mit der Weitergeltung der vorlie¬
genden Vertragsbedingungen dem Anwender gegenüber einverstanden.
(2) Der Anwender muß die vorliegenden Vertragsbedingungen sorgtällig aufbewahren. Vor der Weitergabe der Sollware
muß er sie dem neuen Anwender zur Kenntnisnahme vorlegen. Sollte der Anwender zum Zeitpunkt der Weitergabe die
vorliegenden Vertragsbedingungen nicht mehr im Besitz, haben, ist er verplliehtet, ein Ersalzexemplar beim Hersteller
anz.ufordem. Die entstehenden Versandkosten trägt der Anwender.
(.3) Im Falle der Weitergabe muß der Anwender dem neuen Anwender .sämtliche Programmkopien einschließlich gege-
benenlälls vorhandener Sicherheitskopien übergeben oder die nicht übergebenen Kopien vemiehten. Infolge der
Weitergabe erlischt das Recht des allen .Anwenders zur Programmnutzung.
Der Anwender ist verpflichtet, der Informationsptlichl nach 11 dieses Vertrages nachzukommen.
5 Rekompilierung und Programmänderuiigeii
(11 Die Rückübersetzung des überlassenen Programmcodes in andere Codeformen (Rekompilierung) sowie son.stige
Arten der RUckerschließung der verschiedenen Hersiellungsstufen der Software iReverse-Engineering) einschließlich
einer Progratnniänderung sind im privaten Bereich zulässig.
(2) Die Entfernung eines Kopierschulz.es oder älmlicher Schulzrouiinen isl nur zulässig, sofern durch diesen
Schuizmcchanismus die störungsfreie Pogruinmiiutzting hccinlrächligl oder verhindert wurde. Für die Beeinträchtigung
oder Verhinderung störungsfreier Benutzbarkeit durch ilen Schulzmechanismus trägt der Anwender die Beweislast.
|3) Die in den voranstehenden beiden Absälz.en angesprochenen Handlungen dürfen nur dann kommerziell arbeitenden
Dritten überlassen werden, die mit dem Lieferanten in einem potentiellen Wetlbewerbsvcrhälinis stehen, wenn der
Lieferant die gewünschten Programmänderungen nicht gegen ein angemessenes Entgelt vornehmen will. Der Anwender
muß dem Lieferanten eine hinreichende Frist zur Prüfung der Auftragsübemahme einräumen.
(4l Urherberrechlsvermerke, Seriennummern sowie sonstige der Prograinmidentilikalion dienende Merkmale dürfen auf
keinen Fall enlfemt oder verändert werden.
A Gewährleistung
(1) Mängel der gelieferten Software einschließlich der Handbücher und sonstiger Unterlagen werden vom Lieferanten
innerhalb der Gewährleistungsfrisl von sechs Monaten ab Lieferung nach entsprechender Mitteilung durch den
Anwender behoben. Dies geschieht nach Wahl des Lieferanten durch kostenfreie Nachbesserung oder durch
Ersatzlieferung in Fonn eines Updates.
(2) Kann der Mangel nicht innerhalb angemessener Frist behoben werden, ixler ist die Nachbesserung oder
Ersatzlieferung aus sonstigen Gründen als fehlgeschlagen anzusehen, kann der Anwender nach seiner Wald
Herabsetzung der Vergütung (Minderung} (Kler Rückgängigmachung des Vertrages (Wandelung) verlangen. Von einem
Fehlschlagen der Nachbesserung ixier der Ersalzlieferung ist erst auszugehen: wenn dem Lieferanien hinreichende
Gelegenheit zur Nachbesserung oder Ersatzlieferung eingeiüumi w-urde. ohne daß der gewünschte Frtblg erzielt wurde:
wenn die Nachbesserung oder FrsulzIieterung unmöglich ist; wenn sie vom I,.ieferanten verweigert oder unzumutbar ver¬
zögert wird; wenn begründete Zweitel hinsichtlich der hrlolgsaussichten bestehen; oder wenn eine Unzumutbarkeil aus
sonstigen Gründen vorliegt.
(3) Der Anwender weiß, daß nach dem heutigen Stand der Technik die Erstellung völlig fehlerfreier Software nicht mög¬
lich ist.
7 IJrilersiiehung.s- und Kügeptlicht
(I ) Der Anwender ist verpflichtet, die gelieferte Software auf offensiclitiichc Mängel, die einem durchsehnittüchen
Kunden ohne weiteres auffallen, zu untersuchen. Offensichtliche Mängel, insbesondere das Fehlen von Üntenträgeni
oder Handbüchern sowie erhehlichc. leicht sichtbare Beschädigungen iles Datenträgers, .sind heim Lieferanten innerhalb
von zwei Wochen nach Lieferung schritllich zu rügen. Die Mängel, insbesondere die aufgeireienen Symptome, sind nacfi
Kräften detailliert zu beschreiben.
l2j Mängel, die nicht otfensichtlich sind, mii.ssen beim Lieferanten innerhalb von zwei WtK'hen nach dem Erkennen
durch den Anw'ender gerügt werden.
13) Bei Verletzung der L'nlersuchungs- und Rügepllicht gilt die S<iflware in Ansehung des betreffenden Mangels als
gcnehinigl.
8 Huftung
(1) Für Schäden wegen Rechtsmiingeln und Fehlens zugesichener Eigenschaften haftet der Lieferant unbeschränkt. Die
Haftung für anfängliches Unvermögen. Verzug und Unmöglichkeit wird auf das Fünffache des Überlassungsentgelt.s
sowie auf solche Schäden begrenzt, mit deren Entstehung im Rahmen einer allgemeinen Software-Überlassung lypi-
scherweise gerecliiiet werden muß. Im übrigen haflel der Lieferant nur für Vorsatz und grobe Fahrlässigkeit auch seiner
gesetzlichen Vertreter und Eifüllungsgehilfen, sofern nicht eine Pllicht verlel/J wird, deren Einhaltung für die
Erreichung des Vertragszwecks von besonderer Bedeutung ist iKardinalpnichl).
Bei Verletzung der Kurdinalpflicht ist die Haflung.sbeschränkung für anfängliches Unvermögen entsprechend heranzu¬
ziehen.
i 2) Der Lieferant haftet nicht für Schäden, die durch Fehlbenutzung der Rechenanlage oder durch mangelnde,
regelmäßige Absicherung der Daten in Fomi von Sicherungskopien entstanden sind.
9 Eigentunisvorbehalt
(1) Der l.ieferant l>ehäit sich da.s Eigentum an der dem Anw'ender gelieferten Software bis zur vollständigen Bezahlung
sämtlicher zum Zeitpunkt der Lieferung bestehender (xler später entstehender Fordeningen aus diesem
Verlrag.sverhältnis vor; bei Bezahlung durch Scheck oder Wechsel bis zu deren Einlösung.
(2) Bei verschuldeten Zahlungsrückständen des Anwenders gilt die Geltendmachung des Eigcntumsvorbehalls durch den
Lieferanten nicht als Rücktritt vom Vertrag, es sei denn, der Lieferant teilt dies dem Anwender ausdrücklich mit.
10 Trunsportschüden
Der Anwender ist verptlichtei, eventuelle Transportschäden unverzüglich und .schriflhch dem Transporteur zu melden
und dem Lieferanten eine Kopie des Schriltverkehi's zuzusehicken, denn alle Sendungen sind über den Lieferanten versi¬
chert.
11 Inforniationspnichteii
Der Anwender ist im Falle der Weitervcräiißcrung der Software veipflichtet, dem I .ieferanien den Namen und die voll¬
ständige Anschritt des Käufers schriftlich mit/uleiien. I3ie Adres.se des Lieferanten ist der vorderen Umsehlagseile der
Benutzungsanleitung zu entnehmen.
12 Sonstiges
(1) In diesem Vertrag sind sämtliche Rechte und PHichlen der Vertragsparteien geregelt. Sonstige Vereinbarungen beste¬
hen nicht. Änderungen .sind nur in Schriftlörm und bei Bezugnahme auf diesen Vertrag wirksam und beiderseitig zu
unterzeichnen.
(2) Der Gerichtsstand für alle Streitigkeiten aus diesem Vertrag ist, soweit vereinbar, dies zuständige Gericht in Frankfurt
am .Main.
(3) Sollten ein7.elne Bestimmungen dieser Bedingungen nicht rcchlswirksam sein oder ihre Reehtswirksamkcil durch
einen späteren Umstand verlieren, oder sollte sich in diesen Bedingungen eine Lücke herau.sstellen. so wird hierdurch die
Rcchtsw'irksamkeit der übrigen Bestimmungen nicht berührt. Anstelle der unwirksamen Vertragsbestimmungen oder zur
Ausfüllung der Lücke soll eine angeme.sscne Regelung gelten, die, soweit rechtlich möglich, dem am nächsten kommt,
was die Vcrlragsparleien gew'olli haben, soweit sie von der Unwirksamkeit der Bestimmung Kenntnis gehabt hätten.
MaxonPASCAl.
5
Inhalt _
1. Vorwort zur Version 3. 17
2. Die integrierte Entwicklungsumgebung. 22
3. Der Spezialist für viel Tipparbeit. 42
4. Syntax.85
5. Die Datentypen von MaxonPASCAL. 113
6. Variablen und Konstanten. 145
7. Prozeduren und Funktionen. 147
8. Compiler-Anweisungen und Includefiies. 175
9. Units und Module.191
10. MAKE - die integrierte Projektverwaltung. 219
11. Standard-Units. 235
Anhang. 249
Index
,307
MaxonPASCAl.
7
Inhaltsverzeichnis _
1. Vorwort zur Version 3
1.2.1 Disketten.18
1.2.2 Installation.18
1.2.3 Die Komponenten des MaxonPASCAL Systems.18
1.3 Erste Schritte mit MaxonPASCAL.20
2. Die integrierte Entwicklungsumgebung
2.1 Programmstart und Optionen..22
2.2 Compiler und Editor.23
2.3 Das Konzept.24
2.4 Compiler-Funktionen.....25
2.4.1 Programme übersetzen.25
2.4.1.1 Das Compiler-Fenster .25
2.4.1.2 Abbruch und Ausstieg .27
2.4.1.3 Auswahl von Fehlermeldungen .27
2.4.1.4 Vom Compiler in den Editor .27
2.4.1.5 „Weiter" .28
2.4.1.6 Programmstart aus dem Compiler-Fenster .28
2.4.1.7 Erneutes öffnen des Compilerfensters . 28
2.4.2 Ausführen und Abbrechen.29
2.4.3 Exe- und Dbjektdateien.29
2.4.4 Daten und Informationen.30
2.5 Features und Optionen.30
2.5.1 Ein kurzer Überblick.30
2.5.2 Der Compiler-Requester.30
2.5.2.1 Die Flauptdatei .30
2.5.2.2 Pfade für Include-Dateien und Units .31
2.5.2.3 Eine „Llnl(er“-Einstellung .31
2.5.2.4 Units im Make-Modus .31
2.5.2.5 Arbeitsspeicher .32
2.5.2.6 Diverse Compiler-Schalter. .32
2.5.2.7 Automatisches Erzeugen von Dateien .33
2.5.3 MaxonPASCAL-Systemeinstellungen.33
2.5.3.1 Erzeugen von icons .33
2.5.3.2 Abhängigkeiten in Make-Dateien .33
MaxonPASCAL
8
2.5.3.3 Protokollieren von Ein- und Ausgaben . 34
2.5.3.4 Argumente aus der imaginären Kommandozeile .34
2.5.3.5 Einbindung des Maxon Assemblers . 34
2.5.3.6 Debugger . 34
2.5.3.7 Stackgröße. . 35
2.5.3.8 Autosave . 35
2.5.3.9 Dateiauswahlbox . 35
2.5.4 Abspeichern der Konfigurationsdatei. 35
2.5.4.1 Allgemeines . 35
2.5.4.2 Der Editor . 36
2.5.4.3 Fensterdaten .36
2.5.4.4 Switches und Schalter .36
2.5.4.5 Stringoptionen .36
2.5.4.6 Compiler-Einstellungen . 37
2.6 Die ARexx-Schnittstelle.37
2.6.1 Grundlagen. 37
2.6.2 Der ARexx-Port. 38
2.6.3 Die ARexx-Befehle. 39
2.6.3.1 Schließen, öffnen und Beenden . 39
2.6.3.2 Übersetzen, Starten und Ähnliches . 39
2.6.3.3 Requester und Informationen . 39
2.6.3.4 Make . 39
2.6.3.5 Schreiben von Dateien .40
2.6.3.6 Optionen speichern und setzen . 40
2.6.3.7 Informationen über die Entwicklungsumgebung . 40
2.6.3.8 Fehlermeldungen und Fehlerstellenansprung .41
3. Der Spezialist für viel Tipparbeit
3.1 Installation von Edward auf der Festplatte.42
3.2 Aufruf von Edward.42
3.2.1 Start von der Workbench. 42
3.1.2 Start aus dem CLI. 43
3.2 Eingabe und Bearbeitung von Texten.43
3.2.1 Die Status-Anzeige. 43
3.2.2 BACKSP3ACE und DELETE. 44
3.2.3 UndoLine-Funktion. 44
3.2.4. RETURN, ENTER und TAB. 44
3.2.5 Die Cursor-Tasten und der Ziffernblock. 45
3.2.6 Der Schieberegler. 45
MaxonPASCAL
9
3.2.7 Die Maus.45
3.3 Text.46
3.3.1 Erzeugen von Texten.46
3.3.2 Wahl eines bestimmten Textes. 46
3.3.3 Freigeben eines Textes.47
3.3.4 Löschen des aktuellen Textes.47
3.3.5 Drucken eines Textes.47
3.4 Dateioperationen.48
3.4.1 Speichern von Texten.48
3.4.2 Laden von Texten.49
3.5. Blockoperationen.49
3.5.1 Cut, Copy, Paste.49
3.5.2 Spaltenbiöcke.51
3.5.3 Laden, Speichern und Drucken.51
3.5.4 Einrücken.52
3.5.5 Umwandeln in Groß- bzw. Kleinbuchstaben.52
3.6 Suchen und Ersetzen.53
3.6.1 Das „Find“-Formular.53
3.6.2. Das „Find & Replace“-Formuiar.54
3.6.3 Struktur-Check (Klammer-Check).55
3.6.4 Compiler Error-Datei interpretieren, Fehler anspringen.56
3.6.5 Auf bestimmte Zeilen positionieren.57
3.7 Strukturieren von Texten, Lesezeichen.57
3.7.1Erzeuge Falte.57
3.7.2 Auszeichnen von Zeilen.60
3.7.3 Cursor-Bewegung.60
3.7.4 Lesezeichen (Bookmarks).60
3.9 „Word-Wrap“.62
3.10 Makros.63
3.10.1 Makros aufzeichnen & abspielen.63
3.10.2 Makros speichern & abspielen.64
3.11 Fenster.65
3.11.1 Erzeugen von Fenstern.65
3.11.2 Wahl eines bestimmten Fensters.66
3.11.3 Schließen von Fenstern.66
3.11.4 Arbeiten mit mehreren Ansichten eines Textes.67
MaxonPASCAL
10
3.12 Verlassen des Editors. 68
3.12.1. Unterbrechen der Arbeit. 68
3.12.2 Verlassen des Editors.69
3.13 Iconify & HotKey.69
3.13.1 Iconify.69
3.13.2 HotKey.69
4.14 Der Kommandozeilen-Interpreter.70
3.15 Globale Einstellungen.70
3.15.1 Das „Globale Einstellungen“-Formular.70
3.15.2 Das „Seitenforniat“-Formular. 74
3.16 Benutzerdefinierte Menüs, Tastenbelegung. 75
3.16.1 Kurze Einführung in die EBNF-Darstellung.76
3.16.2 Definition eigener Menüs. 77
3.16.3 Definition der Tastaturbelegung.78
3.16.4 Definition des HotKeys.80
3.16.5 Einladen einer neuen Definition.81
3.17 ARexx - Kommunikation mit Edward.81
3.18 Zurücknehmen von Text-Änderungen.82
4. Syntax
4.1 Allgemeines.85
4.1.1 Syntaktische Notation.85
4.1.2 Symbole.87
4.1.3 Das Semikolon - das ungeliebte Trennzeichen. 88
4.1.4 Kommentare. 88
4.1.5 Bezeichner. 88
4.2 Programmkopf.89
4.3 Blöcke.89
4.4 Label.90
4.5 Konstanten und Konstantendefinition.90
4.6 Typdefinition.91
4.7 Variablendeklaration.92
4.8 Prozeduren und Funktionen.93
4.8.1 Allgemeines über Prozeduren.93
MaxonPASCAL
11
4.8.2 Parameter.97
4.8.2.1 Wert-Parameter .97
4.8.2.2 Variablenparameter .98
4.8.3 Funktionen.191
4.8.4 Prozedurparameter und andere Spezialitäten.102
4.8.5 Zusammentassend: Syntax.104
4.9 Anweisungsteil.194
4.9.1 Wertzuweisung.195
4.9.2 Prozeduraufruf.195
4.9.3 Verbundanweisung.196
4.9.4 Falluntersctieidung.106
4.9.5 HEPEAT-Schleife.197
4.9.6 WHILE-Schleife.197
4.9.7 FOR-Schleife.197
4.9.8 CASE-Anweisung.198
4.9.9 WITH-Anweisung.119
4.9.10 GOTO-Sprünge.111
5. Die Datentypen von MaxonPASCAL
5.1 Numerische Typen.113
5.1.1 Ganzzahl-Typen.113
5.1.2 Gleitpunktzahlen.117
5.2 Boolean.120
5.3Char.121
5.4 Aufzählungs- und Ausschnittstypen.121
5.5 Stringtypen.123
5.6 Pointertypen.128
5.7 SET^iypen.129
5.8 Strukturierte Datentypen: Arrays und Records.130
5.9 Typkonvertierungen.136
5.10 Literale für Records und Arrays.139
5.11 Dateitypen.142
6. Variablen und Konstanten
MaxonPASCAL
12
6.1 Standard-Variablen.145
6.2 Vordefinierte Konstanten. 146
7. Prozeduren und Funktionen
7.1 Ein- und Ausgabe. 147
7.2 Dateien..
7.3 Arithmetische und andere Funktionen. 157
7.4 Pointer..
7.5 AMIGA-Spezifisches.160
7.6 Nützliche MaxonPASCAL-Spezialitäten. 164
7.7 Stringbehandlung. 171
8. Compiler-Anweisungen und Includefiles
8.1 Compiler Directives. 175
8.1.1 Includefiles. 175
8.1.2 Bedingte Compilierung. 177
8.1.3 Error. 173
8.1.4 Linkersteuerung. 179
8.1.5 Compiler-Optionen. 179
t-Suhrange testen. 180
i - Indexbereich bei Array-Zugrift.181
b - Unterbrechen. 181
s - Stacküberlauf abfangen.182
a - Überlauf bei aritbmetischen Operationen melden.182
8.1.6 Kurzauswertung boolescher Ausdrücke.183
8.1.7 Behandlung von Ein-/Ausgabefehlern.185
8.2 Libraries.186
8.3 Anmerkungen zu den Include-Files.188
9. Units und Module
9.1 Modulare Programmierung: was, warum und wie?.191
9.2 Syntax von Modulen. 192
9.3 Objektdateien und Linkersteuerung. 194
MaxonPASCAI.
13
9.4 Alink-Kompatiblität - Fluch und Segen.196
9.5 Hunks.
9.6 Dynamische und statische Variablen.198
9.7 Externes und internes Linken mit „PasLib.o“.199
9.8 Units.201
9.8.1 Ein erstes Beispiel.201
9.8.2 USES.203
9.9 Units - Alles noch ‘mal etwas genauer..203
9.9.1 Syntax.203
9.9.2 Units und Module.205
9.9.3 Schachtelung von USES-Aufrufen.206
9.10 Bezeichner-Handhabung in Units.207
9.11 Initialisierung und andere Spezialitäten..209
9.11.1 Initialisierungs-Prozeduren.209
9.11.2 Prüfsummen.210
9.12 Projekte - Modulares Programmieren mit Units.212
9.12.1 Aufräumen im Unit-Verzeichnis.212
9.12.2 Organisation von Projekten.213
9.13 Assembler und PASCAL.215
10. MAKE - die integrierte Projektverwaltung
10.1 Das Prinzip.219
10.1.1 Wozu eine Projektverwaltung?.219
10.1.2 Was ist das überhaupt - ein Projekt?.219
10.1.3 Was hat das ganze mit „Make“ zu tun?.220
10.2 Die Praxis.221
10.2.1 Erstellen von Projekten.221
10.2.2 Hinzufügen von Dateien, umständliche Methode.223
10.2.3 Übersetzen des Projekts.224
10.2.4 Hinzufügen von Dateien, einfache Methode.224
10.2.5 Abhängigkeiten.225
10.2.6 Weitere Funktionen im Make-Fenster.226
10.2.6.1 Projektpflege .226
10.2.6.2 Übersetzung erzwingen .226
10.2.6.3 Dateien in den Editor laden .226
MaxonPASCAL
14
10.2.6.4 Projektdatei wechseln .227
10.2.7 Compileranweisungen für Objektdateien.227
10.2.7.11nterne Übersetzung .227
10.3 Handgemachte Makedateien.228
10.3.1 Die Grundlagen.228
10.3.2 Der Linkeraufruf.228
10.3.3 Internes Compilieren.229
10.3.4 Exferne Übersetzung.230
10.3.5 Weitere Features.230
10.3.5.1 Zeilenverbindung .230
10.3.5.2 Kommentare...., .231
10.3.5.3 Makros .231
10.3.5.4 Regeln .232
11. Standard-Units
11.1 Crt und PASCALCrt.235
11.2 Printer.242
11.3 Die AMIGA-System-Units.242
11.3.1 Execl und Exec.243
11.3.2 GraphTypes und Graphics.243
11.3.3 Intuition.244
11.3.4 Custom.244
11.4 ExecSupport und ExeclO.245
Anhang
A) Compiler-Fehlermeldungen.249
B) Laufzeitfehler.257
D) Die Kommandos des Editors.259
D-1 Eingabe und Bearbeitung von Texten.260
D-2 Verwalten von Texten.264
D-3 Dateioperationen.266
D-4 Blockoperationen.267
D-5 Suchen und Ersetzen.270
D-6 Strukturieren von Texten.272
D-7 Ändern von Optionen für den aktuellen Text.275
D-8 Word-Wrap.276
D-9 Makros.277
Maxonl'ASCAL
15
D-10 Fenster.278
D-11 Verlassen des Editors.279
D-12 Formulare.280
D-13 Der Kommandozeilen-Interpreter.281
D-14 Ändern von globalen Einstellungen.282
D-15 ARexx - Kommunikation mit Edward.284
D-15.1 Abfrage von Statuswerten Edwards. .284
D-15.2 Laden von Texten aus Edward heraus .287
D-16 UnDo/ReDo - Zurücknehmen von Textänderungen.288
D-17 Verschiedenes.289
E) Editor-Fehlermeldungen.290
E-1 Informationen.290
E-2 Allgemeine Fehlermeldungen.290
E-3 Fehlermeldungen mit Abfragen.294
E-4 Meldungen mit Abfragen.294
E-5 Fehler bei Betriebssystemoperationen.296
E-6 Eingabefehler.297
E-7 Fehler in den Definitionsdateien.298
E-8 Fehler beim Analysieren von Kommandos.300
E-9 Fehlermeldungen beim Auswerten von Kommandos.301
F) Kurzübersicht.302
1. ) Wort-Symbole (reserviert Pascal-Schlüsselwörter):.302
2. ) Direktiven:.302
3. ) Konstanten.303
4. ) Typhezeichner.303
5. ) Variablen.304
6. ) Prozeduren.304
7. ) Funktionen.305
Index.307
1. MaxonPASCAL
17
1. Vorwort zur Version 3
Seit mehr als fünf Jahren cs schon das Ix-kanntc und erfolgreiche Amiga-Pascalsystem
„KickPascal“. Nach einer längeren Pause liegt jetzt wieder eine neue Version vor. Der
Generationswechsel drückt sich diesmal nicht nur durch eine neue Versionsnummer, sondern auch
durch einen neuen Namen aus - „MaxonPASCAL 3“.
Der Ct.impiler ist in seinem Kern größtenteils unverändert geblieben, so daß die Kompatiblität zwi-
.schen KickPascal 2 und MaxonPa.sr'al 3 auf jeden Fall gewährleistet ist,
Neues Herzstück des Systems ist der komfortable Editor „Edward“, der sich schon seit einiger Zeit
im MaxonC^'^-System bewährt hat und übrigens auch separat erworben werden kann. Durch Menüs
und Tastenkombinationen - dies kann vollkommen frei konfiguriert und Ihren Bedürfni.ssen
angepaßt werden - wird der Compiler direkt aus dem Editor angesteuert. Einstellungen aller Art
werden jetzt über Dialogfenster vorgenommen. Auch stinst arbeitet das System jetzt mit wesentlich
mehr Fenstern, was den Komfort und die L.'bersichtlichkeit steigert.
Die Entwicklung umfangreicher Projekte wird von MaxonPASC.Al, jetzt tesser unterstützt. In die
Oberfiäche wurde ein leistungsfähiges utid doch leicht bedienbares „Make“ integriert, das die Üter-
setzung von Modulen automatisiert. Das Modulkonzept ties Compilers wurde zugleich ein wenig
erweitert, so daß man jetzt, kurz gesagt, globale Funktionen wie in C oder C^* in „Header-Files“
deklarieren kann.
Von den zahlreichen Neuerungen an der Benutzerschnittstelle soll an dieser Stelle nur noch die
ARexx-Fähigkeit erwähnt werden. Der Editor besitzt einen i\Rexx-Port, über den er „ferngesteuert“
wertlen kann, und auf diesen Weg kann natürlich auch der Compiler aufgerufen w'erden. Sie kön¬
nen den Compiler aber auch separat, d. h. ganz ohne Editor, starten. Der richtet dann einen eige¬
nen ARexx-Port ein und wartet auf dort eingehende Anweisungen. Auf diese Weise können Sie den
MaxonP.ASC\L-Compiler über ARexx-Scripte in beliebige andere Systeme integrieren und so z. B.
einen anderen Editor einbinden.
Zu guter letzt soll nicht vergessen werden, daß die Units und Includes w'ieder einmal an neue
Betriebssystemversionen angepaßt wurden, AI) sofort gehören die Systemdateien für Version 3.0
zum Liefemmfang. Selbstverständlich werden wir auch in Zukunft mit der Weiterentwicklung des
Amiga-Systems Schritt halten und alle neuen Amiga-Systemincludes für MaxonPASCAL anpassen.
MaxonPASCAL
18
1.2 Ein erster Überblick
1.2.1 Disketten
MaxonPASCAL wird auf muhreren Disketten ohne Kopiersehiitz geliefert. Weitere aktuelle Angaben
finden Sie in der „ReadMe'‘-Datei auf der ersten Diskette. Diese Datei sollten Sie auf jeden Fall als
erstes lesen.
1.2.2 Installation
Um das System auf Ihrer Festplatte zu installieren, sollten Sie sich zuerst ein geeignetes Verzeichnis
anlegegen, z. B. „WORKcMaxonPASCAL".
Nun starten Sie einfach das Installationsprogramm von der ersten Diskette. Damit können Sie das
System natürlich wahlweise auch auf Disketten installieren.
1.2.3 Die Komponenten des MaxonPASCAL Systems
ln diesem ,\lrschnitt sollen die wichtigsten Dateien des MaxonP.'VSCAl. Systems ktirz erläutert wer¬
den. Das soll Ihnen helfen, sich mit den zahlreichen Dateien und Verzeichnissen besser z.urechtzu-
finden.
Bei der Installation wird ein logisches Gerät „P.ASC.\L;‘‘ dem Verzeichnis, in das Sie die Installation
tlurchgeluhrt haben, zugewiesen. Darin befindet sich ein Unterverzeichnis „Bin", in dem die mei¬
sten ausfühiharen Dateien stehen.
“MRASCAL“ ist die integrierte Entwicklungsumgebung. Wenn die Installation korrekt und erfolgreich
abgelaufen ist, können Sie einfach einmal versuchen, tlieses Programm zu starten.
MPASCAl, enthält das komplette Entwicklungssystem einschließlich Compiler und Projektver¬
waltung - nur der Editor muß noch dazugeladen wertlen. 'X'ahrend der Installation wird der Editor
..Edward" in ein Verzeichnis „Edward;" abgelegt. MPASC.AI. lädt ihn von dort automatisch nach. Sie
können Edward aber auch allein ohne Compiler aufrufen.
Edw'ard benötigt unbedingt eine Datei „Edward:Edward.DEF“, in der die Menü- und Tastenbelegung
der Entwicklungsumgebung abgespeichett ist. Diese Datei wird bei der Installation automatisch
erzeugt. Im Edward-Handbuch finden Sie eine ausführliche Anleitung, wie Sie diese Datei ändern
können, um das .MaxonPASCAI.-System nach Ihren persönlichen Vorstellungen und Wünschen zu
konfigurieren.
Sow'ohl MPASCAL als auch Edward benötigen die ..rct.libnirv'". Die.se sollte während der Installation
in Ihr „Dbs:“-Verzeichnis kopiert worden sein.
Neben einigen nützlicheti anderen Funktionen erleichtert die „rct.library“ insbesondere die
Programmierung von Benutzerschnittstellen, die mit dem Oberflächengenerator „MakeAPP“ erzeugt
w'urden. Ein solches Programm benötigt dann aber nicht nur diese Libran', sondern auch eine
1. MaxonPASCAL
19
„.RCT'-Daiei, in der die eigentliche Oberfläche abgespeichert ist. Für MPASCAL lieißt diese Datei
„MP.'\SCAL.RCT" und wird ini Vereeichnis „PASCA].:Din“ erwartet, w'älirend die Edward-Oberfläche in
„EdwardRes.RCT' im Vereeichnis „Edward:“ abgespeichert ist,
L'm MPASCM. zu starten, müssen also folgende Dateien installiert sein und im richtigen Verzeichnis
liegen:
- PASC.AL:llin/MPASCAL
- PASCAL:Bin/MPASCAL.RCT
- ED\X'ARD:Edward
- ED«'ARD:Edward.DEF
- EDW,\RD:MP.ASC.AI3.DEF
- EDWARD:EdwardRes.RCT
- LIBS:rct.library'
In der Entw'icklungsumgcbung können Sie über Requestcr und dergleichen eine ganze Menge
Einstellungen vornehmen. Damit Sie das nicht bei jedem Start des Swiems wiederholen müssen,
können Sie die Einstellungen natürlich auch abspeichern, und zwar in zwei Dateien im Verzeichnis
„S:“:
- „S:Edward.CONF“ Rir Editor-Eiastelltingen,
- ,,S:MPASCAL.config“ für Compiler-Optionen.
Auch diese beiden Dateien werden bei der Installation automaüsch angelegt. Wenn Sie fehlen,
macht das aber nichts, da sowohl .MPASCAL als auch Edward sinnvolle Default-Werte besitzen.
Vorzugsweise sucht das M;ixonP,ASCAL-System ohnehin nicht nach den Dateien im „S:“-Verzeichnis,
sondern versucht nach Möglichkeit, aus dem aktuellen Verzeichnis folgende Dateien zu lesen:
- „Edward.SESSION“ für Editor-Einstellungen,
- „MP-ASCAl,.SESSION“ für Compiler-Optionen,
Diese beiden Dateien enthalten nicht nur .sämtliche Einstellungen und Optionen, sondern auch
Informationen darüber, welche Texte geladen und welche Fenster an welchen Positionen geöffnet
sind. Die ,.Session“-Dateien werden aber nicht bei der Installation erzeugt, sondern auf Verlangen
von MPACAl, bzw. Edward selbst ins aktuelle Verzeichnis geschrieben.
Ferner sollte nach erfolgreicher Installation auch irgendwo ein Verzeichnis namens „HOTHELP:“ exi¬
stieren, in dem alle Dateien und Verzeichnisse liegen, die zum Ünline-Hilfesystem „Hotllelp"
gehören.
Um sinnvoll mit MaxonP.ASCAL arbeiten zu können, benötigen Sie auch Units und Includc-Dateien.
Die Standard-Units befinden sich normalerweise im Verzeichnis „PASCAL:UNITS‘‘, während in „PAS-
CAL:Include“ sowohl die Standard-lncludes von MaxonPASCAL als auch die jeweils aktuellsten
Amiga-OS-lncludes von Commodore liegen. Wenn Sie diese Pfadnamen ändern wollen, sollten Sie
wissen, w'as sie tun, und dieses Benut/.erhandbuch aufmerksam gelesen haben.
Maxonl’ASCAL
2ü
1.3 Erste Schritte mit MaxonPASCAL
Die integrierte Entwickiiingstinigebiing „MPASCAL“ kann wahlweise von der Worklrench nder vom
CI.I aus gestartet werden. Dabei besitzt das Programm keine eigene Benutzcroberiladie, sontlern
lädt den Editor „Edward“ nadi. Eolglidi mtiß dieser Editor korrekt installiert sein. Wird der Etlitor
nicht gefunden, startet iVlaxonP/VSCAI. nicht und giiit eine entsprechende Nachricht aus.
Nach dem Start lantien Sie automatisch im Editor, liier können Sie llire PASCA1.-Pr()gramme schrei¬
ben und bearbeiten. Dem Etlitor „Edward“ ist ein separates l landimch gewidmet, deshalb soll bier
nicht nälier auf die Editor-Funktionen eingegangen werden.
3MQ/AriatyMioril/AnjiyiMS p
m I
. yül j rt feyfwttori.:
MaxonPASCAL
I —. . .■
Projekt 15 Makeflie
Kein Proor'-Mw ubersatzt
Jß!L
vrifceP (’ j
■TifcaP('3.iri.''>;'•
rlfeeP(■tan');
ritffPragn');
rJ.teP('accco9')
titeP('ai:ccot’)
atcalri’)
riteP('atetan’>
pt; intägec).
lege.rj
1 Then
t Ot
lE3|t^
SKPORT;
Vj g I fnfb_
1 rr*
iL
Itgal
HRXON CDHfIRO
Rutor: Thonas £. 14 i« 9 »r
Version f-2
GberflVch« oenerlert «It R.C.T.
<e> nsKoo C«Rput:»r 6nbM ^92
Tunktion: Bogin
Begin
vKiteP (D-' nam«) i If b'' naiÄe*»'?' Tban
Bndi
Begln
aptppi:i,(b),
If ap<pr Thaxv vritePC'('5;
rnPl?c<h'', opl, ap>;
vrit«PCb'- naiie); InPix(b'', op2, ap + l>.
If ap<pr Than vriteP<'>')
Begin ifritePR<b'- vaiue.Q)j Vcit«P(* ') e
oj ProjectMartayr ; _
1 t/PÖW/NnWVysalorll/ftrisXi (3
mmmmmiammmmm
i©i!
421/ 42» efwoi
253/ 253 ofwoC
/Viti besten machen Sie sich jetzt ein wenig mit tlem Editor vertraut, indem Sie ein kleines Programm
sclirciben. Sie könnten z, B. folgendes Linvermcidliche und traditionsreiche Progrämmchen einge¬
ben:
PROGRAM Hello;
BEGIN
writeln{'Hello World!')
END.
Ntin haben Sie ein Progranuii als Quelltext vorliegen und können den Compiler ausprohieren.
Zuerst sollten Sie den Text abs|reicliern, um ihm so einen sinnvollen Namen zu geben, mit dem der
Com|riler atieh etwas anfangen kann. Dann wählen Sie einfach den Menüpunkt „übersetzen“ aus
der Menüleiste tind warten ab, wsis geschieht.
1. MaxonPASCAI.
21
Es üffnci sich ein Fenster, in tiem MaxoiiPASC.M. gegelx-nenfalLs Fehlermeldungen oder Warnungen
ausgibt. Tritt ein Fehler auf, wird er in diesem Fenster gemeldet und der entsprechende
Quelltextbereich angezeigt. Sie können dann eine Fehlermeldung anwählen und mit den Gadgets
„Anspringen“ und „ln Editor“ direkt die entsprechende Textstelle im Editor anspringen.
Wenn das System korrekt installiert wurde und ihr Programm ebenfalls fehlerlos ist, sollte das
Fenster aber ebenso schnell verschwintlen, wie es aufgetaucht ist. Nun können Sic die .Menü-
Funktion „Ausfuhren“ anwählen und das Programm starten. Auch dabei öffnet sich ein Fenster, in
dem (wer hätte das gedacht!) „Hello, World!“ ausgegeben wird. AiilSerdem werden Sie freundlich
aufgefortleri, die <Return>-Taste zu drücken, denn sinnvollerw'eise schließt MP.ASC.AL das Fenster
nicht, bevor Sie Gelegenheit hatten, tlie Ausgabe zu lesen.
Sie können das Programm natürlich nttch einmal starten. Falls Sie seit der letzten Übersetzung etwas
am Quelltext verändert haben, wirtl der Cotnpiler automatisch neu gestartet.
MaxonPASCAL
22
2. Die integrierte Entwicklungsumgebung
2.1 Programmstart und Optionen
Wenn Sie MPASCAI. vom CU bzw. aus einer Shell starten, können Sie optional einige Parameter
angeben. Als erstes können Sic einen Dateinamen angehen, z. B.
run MPASCAL Demos:prg/hello.p
Sofern die angegebene Datei existiert und lesbar ist, wird sie in den Editor geladen. Da der Edward
mehrere Texte verxvalten kann, können Sie natürlich auch mehrere Dateinamen angehen.
Wenn Sie eine andere Konfigurationsdatei als „SiMPAC.AL.conl'ig“ benutzen wollen, können sie ein
zusätzliches Argument mit vorangestelltem „-c“ angehen.
Ein Beispiel: run MPASCAL teet.c -c PASCAL: spezial, config
Zwischen „-c" und dem Dateinamen darf auch ein Leerzeichen stehen.
MaxonP.ASCAL besitzt eine integrierte Projektverwaltung, allgemein bekannt als „Make“. Sie können
gleich Iteim Programmstan eine solche Make-Datei öffnen, und zwar mit der Option „-m“:
run MPASCAL -m plot.makefile.
Natürlich lassen sich diese Optionen und Argumente in beliebiger Reihenfolge kombinieren, z. B.
MPASCAL fclass.p -m wagga.makefile -c d£l:s/MPASCAL.config.
Seit Version 3.0 besitzt MaxonPASCAL einen eigenen ARexx-Port. Wenn Sie als einziges Argument
r“ angeben, also z. B. run MRASCAI. -r startet MaxonPASCAL im .ARexx-Modus. Dabei wird Edward
nicht geladen. Statt dessen wird ein ARexx-Port namens ,.MAXONPASCAI.“ eingerichtet, mit dem das
System über ein ARexx-Script gestetiert werden ktinn. Auch für das Nachladen des Editors und die
Kommunikation zwischen den beiden Programmen müssen Sie dann (über geeignete ARexx-
Programme) selbst sorgen. So können Sie einen beliebigen - cxler auch überhaupt keinen - Editor in
die Umgebung einbinden.
Hinter der Option „-r“ kann optional ncjch ein Portname angegeben werden, z. B. „run .MPASCAL -r
Wagga“.
In diesem Fall wird der .ARexx-Port nicht „.M.AXONPASCAL", sondern „WAGGA“ genannt. Man beach¬
te, daK der Portname in Großbuchstaben umgewandelt wird. In jedem Fall aber gilt, daß
.MaxonPASCAL für eindeutige Portnamen sorgt. Falls z. B. schon ein Port „MAXONP.ASC.AI.“ existiert,
werden so lange „.MAXONPASCAiJ“, „MAXONPASC.A12“, MAXONPASCAL3“ usw. ausprobiert, bis ein
Name gefunden wird, den es im ganzen .System noch nicht gibt.
Alles weitere über den ARexx-Port und was Sie damit anfangen können entnehmen Sie bitte
Abschnitt x.y.
2. Maxon PASCAL
23
2.2 Compiler und Editor - eine harmonische Beziehungskiste
Wie oben schon ajigecleutet, ist der Etlitor „Edward“ ein eigenständiges Programm, das auch ohne
den Compiler benutzt werden kann. MaxonPjCSCAI. lätlt ilin einfach nach und startet ihn als zweiten
Prozess, läEt aber keinen Zweifel daran aufkommen, daE er der BoE ist.
Weniger blumig ausgedriiekt, richtet MaxonPASCAL einen Port ein, über den sich Editor und
Compiler Nachrichten zuschicken. Wirtl im Edward vom Benutzer eine Compiler-Funktion aufgeru¬
fen, etwa durch eines der Ptill-Down-Menüs «ier eine entsprechend belegte Tastenkombination,
läEt Etlward dem Compiler eine entsprechende Nachricht zukommen.
Ich erzähle ihnen diese gattzen implementatorischen Details, damit Sie verstehen können, wie Sie
sich das MaxonPASCAl.-System selbst kontigurieren können. Der Schlüssel dazu ist die „.DEF''-Datei
des Edward. Hier werden alle Menüs und Tastenbelegtmgen des Editors abgelegt, und hier muß
irgendwie tlie Benutzerschnittstelle des Compilers integriert werden, auch wenn der Editor nicht
die geringste Ahnug hat, was ein Compiler ist und wozu er gut ist.
Deshtilb hat der Edward eine Spezial-Funktion namens „Sendi\l)pComm'\ die als Argument wieder¬
um eine Compiler-Funktion erw'aitet. Beispielsweise gibt es eine MttxonPASCAL-Anweisung namens
„compik“. W'ird nun vom Benutzer, also Ihnen, im Etlward ein Menü au.sgewählt, das mit der
Funktion ‘SendAppComm „compik'“ belegt ist, schickt Edward das „compile“ als Nachricht an
MP.ASCAl. und kümmert sich tiann nicht weiter drum. MtixonPASCAL dagegen erhält diese
Anweisung, fordert vom Edward noch ein paar zusätzliche Daten an und beginnt dann freudig tnit
der Übersetzung. Natürlich kann man nicht nur ein Menü, sondern auch eine Taste oder
Tastenkombinaiion mit diesen „.S'mMppC’o»»»''-Anweistingen belegen.
Auf diese Weise sind tier Compiler und der Editor vollkommen voneinander abgekoppelt, und
Edward braucht nichts über MPASCAl, zu wissen. Nun kommt es natürlich vor, daß Sie tlen Edward
einmal „einfach .so“ ohne Compiler benutzen wollen. Deshalb läßt Edward einen kleinen
„Preprozessor“ auf das „.DEF-‘-File Icjs und filtert je nach Modus Teile aus dem Text aus - ähnlich wie
ein C-Preprozessor bei „#ifdei’‘-Zeilen. Auch dieses Feature ist in ihrem Edward-Handbuch
beschrieben. MPASCAL teilt dem Edward mit, tlaß ein Symbol namens „MPASCA13“ definiert sein
soll. Nun können Sie Dinge wie .,#ifdef MP.ASCAI,3“ in Ihre DEF-Datei schreiben, um Definitionen
je nach Modus ein- oder auszublenden. Insbesondere werden Sie sich um sämtliche Menü-
Definitionen des Compilers eine „#ifdef MP,ASCAL3 ... #endif‘-Klammer legen wollen, wie es auch
in der mitgelieferten Staiulard-Datei der Fall ist.
langer Rede kurzer Sinn: Wenn im folgenden von irgendwelchen Menüs die Rede ist, werden dabei
jetlesmal Hinweise wie „...oder wie auch immer Sie diese Funktion konfiguriert haben“ unterschla¬
ge. Gemeint ist damit jeweils immer die Funktion, die in der Standard-Konfiguration auf dem ent¬
sprechenden Menü liegt.
MaxonPASCAL
24
Es gibt übrigens standardmäßig fttigende Menüs, mit den naciisteiiend angegebenen Compiier-
Funktionsnamen:
* Compiler
- Übersetzen eompiic
- Compiie Datei eompfiie
- Ausfuhren run
- Aitbreciien break
- Exe-Datei exefiie
- Objektciatei nbjectfiie
- Informatiün info
- Fehiermeidungcn errors
* Make
■ Projektveixvaitung make
- Neues Makefiie newmk
- Makefiie iaden ioadmk
- Text aus Editor aufnetimen addedittx
- Text unti Objekt aufnehmen adcitxobj
- Make verfassen ieavemk
* Optionen
- System opsys
- Compiierüpcomp
■ Optionen sichern saveconf
2.3 Das Konzept
Auch auf die Gefahr hin, daß ich Sie damit langweiien könnte, möciite ich trotzdem noch ein paar
grundsätziiche Anmerkungen loswerden.
Prinzipiell kann MtixonPASCAI. in zwei venschiedencn Modi arixiiten: Im „normalen“ Modus, in dem
man vor allen kleinere Programme (mit nur einem Modul) schreibt, und im „Make“-Modus. Da der
Projekverwaltung „Make“ ein eigenes Ka[)itel gewidnet ist, befassen wir uns zunächst nur mit dem
Standard-Modus, der natürlich auch aktiv ist, wenn Sie das MaxonPASCAL-System starten.
Auch wenn Edward beliebig viele Texte gleiclizeitig beaiiaeiten kann, venvaltet MaxonP.ASC.AI,
immer nur ein Programm. Das hat zum einen Gründe, die mit dem Speicherplatz Zusammenhän¬
gen, und resultiert zum anderen aus der Beobachttmg, daß das in der Praxis nicht besonders rele¬
vant ist, weil man normalerweise zwar durchaus mit mehreren Texten, aber an nur einem Programm
arbeitet.
Die Funktion „compiie“ übersetzt stets den Text im gerade aktiven Fenster. Bei „run“ wird immer
zuerst folgendes geprüft;
- Liegt überhaupt ein übersetztes Programm vor?
- Befindet sich der Quelltext dieses Programms im aktiven Editor-Fenster?
- Blieb er seit der letzten Übersetzung unverändert?
2. MaxonPASCAI.
25
Falls eine der drei Fragen mit „Nein“ |■)eantworlel werden miiK, wird die „eom/j//e“-Funktion aul'ge-
rufen und damit der Text im aktiven Fettster übersetzt.
So, das sollte gesagt werden, damit Sie beim Rtimprobieren mit MtixonPASCAI. (was Sie wahrschein¬
lich schon langst getan haben) nicht in vermeiilhare Verwirrung stürzen (was dabei hoffentlich nicht
geschehen ist), l.lnd nun folgt endlich eine ausführliche Beschreibung der Funktionen von
MaxonPASCAI.:
2.4 Compiler-Funktionen
2.4 .1 Programme übersetzen
2.4.1.1 Das Compiler-Fenster
Am besten langen war mit der Funktion an, wegen der Sie .Ma,xonPASC.AL überhaupt gekauft haben,
nämlich dem lÜxirsetzen von Programmen.
Wctin Sie diese Funktion auswählcn, ward - je nach Modus - entw'eder das Programm im gerade akti¬
ven Editor-Fenster übersetzt, txler das integrierte „Make“ entscheidet selbst, welche Objektdateien
neu übersetzt w'erden sollen, ln jedem Fall öffnet sich alterein Fenster, das in fünf Bereiche aufge¬
teilt ist.
:aiti*.3.M0/Ar>aly^j>1or.liyArwly9tarpg?felj*g 3 ts
..„rtfPfi
trxnrr.
“«n<iiii.p‘ ’ . z.ii. " {4a. gg ' ;n~"Sü :' -.
Error Unknown or Syn^a*: «rfc-r
IF THEN . i
_ „ »r :« C L«rF 8 th<»»
EHO*
yt !» Str*H*runa<W« 5 <V-mnY,. hoch«»t>}
EXPO
In Editor ] flbbrochen I
Shel
ijgica
ff
PRQCBßÜRE Wrib6P<8-Sti:);
PROCBDÜRE WritePR<fatypj f?:infcag©r);
Function Prt(h:p) inbegsE; — 'll'
Begfin
Cai«e b'' tßt
Op«l8boe: C4d«
IMPORT;
IMPORT;.
End;
Ptl: •
b:' name Of
j Prl -Ij
r : Prl:»2;
Pti»3
i
E3{c&
♦21/ 421 cfwol
2:/oera/fln« tyft* t.>r n/Art«! 0 .p
253/ 253 OfWQl
Am oberen Rand befindet sich die Staiuszeile. Hier wird stets links der Name der gerade ülx-rsetzten
Datei angezeigt, während MaxonPASCAI, rechts sagt, was gerade getan wird hzw. zuletzt getan wur¬
de.
MaxonPASCAI.
26
.Am besten probieren Sie es einmal aus: laden Sie einen Paseal-Quelllext (z. B, eines der
Beispielprogramme) in den Editor und wählen Sie den Menii|)unkt „Übersetzen“ aus. Wenn alles
klappt, wird oben rechts in schneller Folge (bei kurzen Programmen wohl zu schnell zum Mitlesen)
das folgende Au.sgegeben:
- „Compiling“:
Der Compiler liest und analysiert tias Programm.
- „linking“:
Der l.itiker bindet das erzeugte Programm mit den nötigen Bibliotheksfunktionen zusammen.
- „Fertig“:
Das Programtn ist übersetzt und ausführbar. Wurden keine Fehler oder Warnungen ausgege-
beti, verschwindet das Fenster bei dieser Meldung automatisch.
Natürlich kann dabei beliebig viel scbiefgehen, beispielsweise könnte das Programm fehlerhaft sein.
Fehlermeldungeti und Warnungen aller .Art werden in dem Rahmen unterhalb der Statuszeile au.sge¬
geben. MaxonPASC.AL gibt immer höchstens so viele Fehler aus, wie in diesen Rahmen passen (das
sind zehn Stück) und wartet auf eine Reaktion des Benutzers, falls die Flüchstzahl erreicht wairdc.
Eine solche einzeilige Fehlermekiung allein ist meist natürlich nicht aussagekräftig genug. Deshalb
kann sich der Programmierer jeweils zu einer Meldung ausführlichere Informationen anzeigen las¬
sen;
Unterhalb des Fehlermeldungs-Rahmen befindet sich ein weiterer Rahmen, in den normalerweise
zwei Zeilen ausgegeben w'erden. Darin stehen Quelltextdatei, Zeilen- und Spaltennummer des gera¬
de angew'ühlten Fehlers und noch einmal eine Wiederholung der schon im oberen Rahmen ausge¬
gebenen Fehlermeldung. Unterhalb dieser Anzeige .sehen Sie einen Ausschnitt aus dem Quelltext
mit einem Pseudo-Cursor an der fraglichen Position.Wenn allerdings der Linker Fehler meldet, steht
anstelle der Sourceposition (w'as weiß ein Linker schon von Quelltexten!) schlicht „Linker Error“,
und dort, wo sonst der Quelltext-Ausschnitt dargestellt wird, steht eine eventuell verkürzte Liste der
beim Zusammenbinden aufgetretemen Fehler, also hauptsächlich Namen von Undefinierten oder
gleich mehrfach definierten Linker-Symltolen.
Weniger häufig treten beim Übersetzen unter dem Titel „Fatal Error“ Fehler bei der
Codegenerierung oder beim Assemblieren auf. Meist sind diese auf Speichcrmangel zurückzu¬
führen. und dementsprechend heißen sie „Out of Memory“, „Workspace overflow“ oder wie
auch immer.
last not least gibt es ganz unten im Compiler-Fenster noch eine Gadgetleiste. Zunächst ist hier nur
das Gadget ganz rechts mit der Aufschrift „Abbrechen“ an wählbar. Bei Bedarf w'erden die übrigen
Gadgets aktiviert.
2. MaxonPASCAI.
27
2 . 4 . 1.2 Abbruch und Ausstieg
Ini Gegeasatz zu einfachen K()mmaiul()zeilen-Cum()ilern besitzt das M;txonPASCAL-Fenster eine
Vielzahl von Knöpfen und Funktionen, an denen der Pascal-Programmierer herumspielen kann. Alle
Gadget-Funktionen sind, um den Kediirfnissen der „echten Programmierer“' entgegenzukommen,
auch durch Tasten oder Tastenkombinationen bedienbar.
Beim Start des Comjtilers können Sie im Compiler-Fenster zunächst nur zss'ei Dinge tun: Das
Fenster schließen (xler die Übersetzung abbrechen.
Mit einem Klick auf das SchlieK-Gtidget wird die Übersetzung abgebrochen und das Fenster
geschlos.sen. Die Taste <ESC> hat die gleiche Wirkung.
Außerdem gibt es unten rediLs das Irereits erwähnte „Abhrechen“-Gid^a. Man l-tenutzt es, wenn
man den Compiler zwar abbrechen, aber noch irgendwelche im Window ausgegebenen Meldungen
in Ruhe lesen möchte. Die kanonische Tastenkombination <Control> + <C> entspricht diesem
Gatlget.
Falls der Compiler ater schon fertig ist, wird das Compiler-Fenster bei einem Klick auf
„Abbrechen“ geschlossen.
2.4.1.3 Auswahl von Fehlermeldungen
Laut Muiphy geht bei so ziemlich jedem Compiler-Iaiuf emas schief, und meist sogar etw'as mehr als
nur „etwas“. Deshalb bietet das Comitiler-Fenster Platz für bis zu zehn Fehlermeldungen auf einmal.
Eine dieser jeweils einzeiligen Meldungen ist immer invertiert und somit hervorgehoben, und zu
genau dieser Meldung werden unterhalb des Rahmens zusätzliche Informationen angezeigt. Mit
einem Mausklick auf eine Fehlerzeile macht man diese zur gerade privüegierten, invertierten
.Meldung.
Das geht aber auch über die Tastatur: .Mit der <Leertaste> durchläuft man die Fehlermeldungen
von oben nach unten, und mit <Backspace> in die andere Richtung. .Alternativ können Sie auch
die Cursortasten <.Auf> und <Ab> benutzen.
2.4.1.4 Vom Compiler In den Editor
Der besondere Witz an einer integrierten Umgebung ist das perfekte Zusammenspiel von Compiler
untl Editor, in.sbesondere das automatische Anspringen von Fehlerstellen.
Das funktioniert bei MaxonP.ASC.>AL denkirar einfach: Sobald eine Fehlermeldung im Compiler-
Fenster au.sgegeben wird, werden auch zw'ei Gadgets mit der Aufschrift „Attspringen“ bzw. „In
Editor“ aktiviert. Nun wählen Sie wie oben beschrieben Ihre Wunsch-Fehlermeldung aus (das gehl
übrigens auch, während der Compiler noch arteätet) und klicken „Anspringen“ an. Prompt lädt
Edwartl die zugehörige QucTItextdatei (falls der Text nicht ohnehin schon im Editor vorliegt) und
setzt den Cursor an die bemängelte Position. Nun können Sie den Fehler terichtigen - vorausgesetzt
natürlich, der Compiler läuft nicht noch unil hat ein „Lock“ auf diesen Text eingerichtet. Das
Compiler-Fenster wird dabei nicht geschlossen, ,so daß Sie noch weitere Fehlerstellen anspringen
können.
MaxonPASCAL
28
Die Imegraiwn von Com|3iler und Editor geht allerdings niclit so weit, daß im Compiler-Fenster
Quelltext-Veränderungen beachtet würden. Wenn Sie z. B. zuerst einen Fehler berichtigen und
dabei einige Zeilen einfügen oder löschen müssen, merkt MaxonPASCAl. nichts davon. Sollten Sie
also anschließend ein weiter unten im Quelltext gelegene Fehlerstelle anspringen lassen, landen Sie
gnadenlos in der Zeile mit der Nummer, in der der Fehler lag, als er hemerkt wurde - und durch die
inzwischen vorgenommenen .Äntlenmgen stimmt diese Zeilennummer inzwischen vielleicht nicht
mehr, unti Sie landen einige Zeilen zu hoch oder tief. Das dürfte aber in der Praxis kaum ein
Problem darstellen, denn im Compiler-Fenster wird immer noch der ursprüngliche Quelltext mit
dem Cursor an der richtigen Stelle angezeigt, und durch einen kurzen Textvergleich zwischen
Compiler- und Editorfenster können Sie schnell die wirkliche Fehlerposition „zu Fuß" an,steuern.
Außerdem ändert man in der Praxis Irci Compilerfehlern meist sowieso nur die fragliche Zeile, ohne
großartiges Löschen und Einfügen von Zeilen.
Das Gadgct „Anspringen“ ist nebenbei bemerkt mit dem Shorteut <A> belegt.
.Manchmal tritt w'ährend der Ühersetzung nur ein einziger Fehler auf, der vielleicht noch den einen
oder anderen Folge-Fehler nach sich zieht, aber trotzdem nur eine einzige .Antlerung am Quelltcxt
notwendig macht. Deshalb gibt es auch noch das Gadget „In Editor“. Hier wird im Etlitor die gera¬
de angewählte Fehlerposition angesprungtn (genau wie beim „AMS/)r/w,gen“-Gatlget) und gleich¬
zeitig das Compiler-Fenster geschlossen - wobei natürlich auch der Compiler abgebrochen wird,
sollte er noch am arheiten sein.
Alternativ können Sie auch die Tasten <Return> oder <E> drücken, und ebenso gut können sie
auch mit der Maus einen Doppelklick auf die Fehlermeldung machen.
2.4.1.5 „Weiter"
Treten heim I.ibersetzen hzw. Linken mehr Fehler auf, als im Rahmen dargestellt w'ertlen können
(das sind bekanntlich zehn Stück), wartet der Compiler erst einmal ab, und da.s„We//er‘'-Gadget
w'ird anwählbar. Nach einem Klick auf selbiges läuft der Compiler wieder weiter, bis erneut zehn
Fehlermeklungen voll sind. Meist ist es aber nicht unhedingt sinnvoll, nach mehr als zehn Fehlern
noch w'eiter zu übersetzen, denn normalerweise kommt dabei nicht mehr so ganz viel sinnvolles
raus. Deshalb wird man in der Regel das „W'efter“-Gadgct meitten und lieber die Fehler korrigie¬
ren.
2.4.1.6 Programmstart aus dem Compiler-Fenster
Wenn MtrxonPiVSC.AI. bei der Übersetzung keine Fehler, sondern nur Warnungen ausgegeben hat,
wird ein laufflthigcs Programm erzeugt. Wenn das dann auch noch zusammengebunden (gelinkt)
werden konnte, taucht unten rechts das „Atortew“-Gadget auf. Mit einem heherzten Klick darauf
können Sie das Programm starten.
2 . 4 . 1.7 Erneutes öffnen des Compilerfensters
Wenn Sie das Compiler-Fenster geschlo.ssen haben und es doch noch einmal sehen wollen, können
Sie es mit dem Menüpunkt „Fehlermeldungen“ noch einmal öffnen. Wie der .Name schon andeu-
2. MaxonPASCAL
29
tin, sind dann alle Felilermeldiingen der letzten Compilierung wieder sichbar, und auch sonst prä¬
sentiert sich das Fenster in dem ZustantI, in dem es sicli beim SchlieKen befand.
2.4.2 Ausführen und Abbrechen
Die zweite wichtige Funktion aus dem „Compiler '-Menii heibt Ausfuhren“ und tut auch genau
das: Ein Pascal-Programm wird gestartet.
Vorher prüft MaxonPASCAL allerdings noch, ob nicht vielleicht erst noch der Compiler konsultiert
werden muß, und startet selbigen automatisch.
Anschließend ward ein Text-Fenster für die Ein- und Ausgaben des Programms geöffnet. Falls das
Programm tat.sächlich etwais ausgegeben liat, erscheint nach erfolgreicher ProgrammausFührung die
Aufforderung „Press Return“ - Sie sollen also die < Return>-Taste driicken und so bestätigen, daß
Sie die Au.sgaben des Programms auch gelesen haben.
Wälirejul das Programm lätifi, sind verschieticne Funktionen des Systems gesperrt, z. 13. darf man es
(trotz Multitasking) nicht ein zweites mal gleichzeitig starten, oder man kann den Com|riler nicht
laufen lassen, weil man dem laufenden Programm ja dadurch den Code unter den Füßen wegziehen
bzw. übersebreiben würde. Das ist sicher sinnvoll und stört wohl nicht w'citer - es sei denn, das
Programm ist irgentlwo hängengebliehen und läßt sich nicht normal beenden.
Gegen „normale“ Endlosschleifen Irilfi die Compileroption „Unterbrechen“. Schwieriger wird cs
dagegen, wenn der Piozeß abgestUrzt ist, auf ein Ereignis wartet, das nie eintreten kann oder die
erwähnte Breakpoint-Option einfach nicht benutzt wurde. Desitalb (und nur für solche Fälle!) gibt
es im Com|riler-Menü die Funktion ,gU>brechen“, die tien gestarteten Prozeß schlicht abtötet und
dann das Ausgabe-Fenster schließt. Auf den ersten Blick eine praktische Lösung, alter leider gibt es
auf tlem Amiga (im Gegensatz z.B, zu Unix) keine saubere Möglichkeit, einen Prozeß aus dem
System zu entfernen. Insbesondere werden dabei keine Ressourcen (reservierter Speicher, geölTne-
te Dateien, Screens und Fenster etc.) freigegehen. Sie müssen davon ausgeheit, daß sie auf diese
Weise freien Speicher verlieren, wenn Sie einen lü'oz.eß auf diese brutale .Art abbrechen. .Aber das ist
im Zw'eifel immer noch angenehmer, als das .MPASCAI.-System neu zu starten oder gar den Rechner
zu booten.
2.4.3 Exe- und Objektdateien
Ungeachtet allen damit verbundenen Komforts wealen Sie ihre Programme wtthl nicht immer nur
aus der integrienen Umgebung starten wollen. Desliallr gibt es im ,,Compiler“-Menü zwei
Funktionen, die das übersetzte Programm in Dateien schreiben;
„Exe-Datei“ erzeugt eine ausfühdrare Programmdatei - vorausgesetzt natürlich, ein Programm
ist korrekt übersetzt und gelinkt worden.
»w' „Objekt-Datei“ schreibt zur zuletzt compilierten ilbersetzungseinheit eine Objektdatei, aus
der m;in später ein ausführbares Programm erzeugen kann. Im „Make''-Modus ist diese
MaxonPASC^
30
Funktion nicht unbedingt sinnvoll, denn dort werden liiese Objektdateien ja beim Compilicren
automatisch er/eugt.
2.4,4 Daten und Informationen
Mit dem Meniiptmkt „Information“ bffnet man ein Fenster, in dem Informationen über den Status
von MaxonP.VSCAJ. angezeigt und stäntlig aktualisiert werden. .Neben dem üblichen Rhabarber über
Autorschaft und Copyright (klicken Sic doch einfach mal auf den Namen des Autors...) können Sie
hier hei bedarf nachlesen, welchen Quellte.xt Sie zuletzt ültersetzt oder welche Make-Datei gerade
geladen ist. Liegt ein ülx;rsctztes Programm im Speicher vor, wird auch seine GröRe angegeben.
Dalrei handelt es sich genaugenommen um den Platzbedarf des Programms, wonn es in den
Speicher geladen wird, und nicht um die GröRe der Exe-Datei.
2.5 Features und Optionen
2.5.1 Ein kurzer Überblick
Für viele Programmierer ist das Schönste an einem Compiler, daR man so viele Optionen und
Switches hat, an denen man herumspielen kann, bei MaxonPASCAL nimmt man sämtliche dieser
Einstellungen über Requester vor, deren es genau zwei gibt: Einen - „System“ - für allgemeine
Einstellungen, die in irgendeiner Weise mit dem MaxonP.ASCAl.-Systcm zu tun haben und einen für
die unvermeidlichen Compiler-Optionen.
Wenn Sie wollen, können Sic beide Requester gleichzeitig öffnen. In jedem der Fenster linden Sie
am unteren Rand die obligatorischen Gadgets „OK“ und „Abbruch“, mit tienen Sie die vorgeiutm-
menen Einstellungen bestätigen bzw. Sie wieder veroerfen können.
2.5.2 Der Compiler-Requester
0 1 Cotopte" Octiom
ilauptd«t«> l: | Ifltl
■»/' 1 Subrangp
( Indeisberelch
.J.nc lude-Pf «d : |RRM; Ihc (wd* ■ ~
v^l tlntgrbPPCbgn
Kop ier-Pf ad s |Pasc« t: I(ic (u«tP
1 StackaPBB*
ünSt-Pfad: tRM1:Unlt - ~
‘ iQptthn. jibertauf
Kopler-Pf ad! SUnIt.
_Ijtbbuospr-batel
Ltnkep: 0| anoss/kidln •«»< f
Rutonatisch errzeugen:
Maka-Ufllt»! | 1
■v' t EKd-Patc l
Hrbeltjtapplcher: MdB | KBvte
> ObJ^ektdatpt
OK 1
fibbrechan f
2.5.2.1 Die Hauptdatei
Wenn Sie eine Unit übersetzt haben, wollen Sic wahrscheinlich anschließend auch testen, ob sie
funktioniert. Beim Versuch, sie wie ein Programm zu starten, werden Sie von der MaxonPASC.AL-
2. MaxonPASCAI.
31
Umgebung allerdings nur eine ents|rrechende Fehlermeldung erhalten. Deshalb können Sie eine
sogenannte Mauptdatei (in Version 2.x noch „Main File” genannt) angeben, die immer dann automa¬
tisch compiliert wird, wenn eine Unit übersetzt wmrde. Sinnvollcrweise wird dies dann ein
Programm sein, das Ihre Unit auch benutzt.
Der Name dieser Datei kann im Textfeld „Hauptdatei“ des Compiler-Requesters eingetippt w'er-
den. Gleich rechts von jenem linden Sie ein Gadget, das den Filerequester öffnet und so die
Auswahl der Hauptdatei bequemer macht. Fan Klick auf das schlicht mit „L“ beschriftete Symbol
löscht tien Inhalt des Textgadgets.
Im Make-Modus wird die Hauptdatei generell ignoriert.
2.5.2.2 Pfade für Include-Dateien und Units
ln vier Textfeldern können die Verzeichnisse eingetragen werden, in denen MaxonPASC.Al. Units
unti Indudes suchen soll. Optional kann jeweils ein zweites Verzeichnis angegeben werden, in das
die Dateien automatisch umkopiert werden. Mehrdaz.u in den Kapiteln über Indudes bzw. Units.
2.5.2.3 Eine „Linker"-Einstellung
Der integrierte Linker von MtixonPASC.AI. ist im wesentlichen zum Amiga-Standard-Linker .Alank”
(bzw. der besseren PD-Version „BLink") knmpatihel. Jener Linker erkennt Bezeichner nur dann als
identisch, wenn Sie in ihrer Groß-zKleinschreibung übereinstimmen. Beispielsweise sind für ihn
„Test“ und „test“ zwei verschiedene Namen. Dagegen ist man es als Pascal-Programmierer gewohnt,
daß die Schreibweise von Bezeichnern keine Rolle spielt. Deshalb haben Sie durch dieses Menü die
Wahl, oh der integrierte MaxonPascal-l.inker sich Pascal-mäßig verhallen („GROSS/klein egal“)
oder sich an den ,ALink“-Standardhalten soll („GROSS/klein beachten“).
2.5.2.4 Units im Make-Modus
Die neue Projektverwaltung „Make" unterstützt die Verwaltung von Projekten, die in Module geglie-
den sind. Dabei wird man aber meist nicht auf Units verzichten wollen. Ab.schnitt 7.9.2 („Units und
Module“) verrät Ihnen alles, was Sie bei tler Kombination dieser beiden Konzepte zu beachten
haben.
Nun gibt es für das „Make“ aber noch ein Problem: Da es immer nur die Module recompiliert, bei
denen es auch sein muß, kennt es nicht alle im Projekt benutzten Units. Deshalb wird das
Nachladen von Units im Make-Modus etwas anders gehandhabt: Sie als Programmierer haben die
(sicher nicht übermäßig schwere) Aulgabe, alle im Projekt benutzten Units in das Gadget „Make-
Units“ im Compiler-Requester einzutragen. Beim Linken des Projekts werden dann diese (und nur
diese) Units dazugeladen. Die Namen der Units sind ohne Punkt untl Komma, aber mit Leerzeichen
getrennt einzugeben, z. B. „Printer Intuition Window's./PascalCrt“.
MaxonPASCAL
32
Hinweis
Außerhalb des Make-Modus hat dieses Gadget keinerlei Bedeutung.
2.5.2.5 Arbeitsspeicher
Als (eliemaliger) KickPa.scal-AnweiKler werden Sie sicli noch daran erinnern, daK Sie beim Start des
KP-System.s immer die Gröl;le tles „Workspace“, al.so des Aiiicitsspeichers, auswählen mufsiten. Bei
MaxonPASCAl. ist das nicht mehr nötig, denn der Etlitor Edward vewaltet seinen Speicher voll dyna¬
misch.
Nach wie vor braucht aber der Compiler einen zu.sammenhängenden Speichcrblock ausreichender
Größe. Diese Form der Speicherverw'altung ist vielleicht unschön, aber zugleich eine der Ursachen
für die Geschwindigkeit des MaxonP.\SCAL-Compilers.
Utnger Rede schwacher Sinn: Der Compiler reserviert sich al.so einen gewissen .Arbeistspeicher, und
wenn dieser während tier Übersetzung überläufi, gibt es eine Fehlermeldung, ln diesem Fall sollten
Sie den Eintrag „Arbeitsspeicher“ im Compiler-Requester nach Gutdünken hochsetzen. Für
mittelgroße Pnjgramme ist die Voreinstellung von 80 KByte aber ausreicbend.
2.5.2.6 Diverse Compiler-5chalter
Oben rechts im Compiler-Requester finden Sie sieben Schalter, mit deneti Sie jeweils bestimmte
Compiler-Optionen ein- und aus.schaltcn können:
• Subrange testen:
Die Grenzen von Ausschnittstypen sintI bei Wertzuweisungen zur Laufzeit zu prüfen.
• Indexbereich:
Bei Array-Zugriffen sind die Grenzen zu testen.
• Unterbrechen:
An geeigneten Stellen wird im Code eine ülxtrprüfiing der Signalbits eingebaut, so ciaß das
Programm mit der 'l'astcnkombination Control-C abgebrochen werden kann.
• Stackgröße:
Ein iiberlaufdes Laufzeitstacks ist abzufangen.
• Arithmetischer Überlauf:
Bei Reebenoperationen jeder Art sintI Überläufe abzufangen.
• Semikolon melden:
Fehlende Semikoki (al.so diese Dinger) sind als Fehler zu mekien. Das etwas obskure
Kickfwscal-Feature, fehlende Semikola automatisch ergänzen zu lassen, wird von MaxonPASCAl.
nicht mehr unterstützt. Allerdings führt ein solcher Fehler aber auch nicht zum Abbruch der
l Übersetzung.
2. Maxon PASCAL
33
• Debugger-Datei:
Isi diese Optiun aktiviert, werden die Dateien Tiir den demnächst erhältlichen Debugger
er/eugt.
2.5.2.7 Automatisches Erzeugen von Dateien
Mit den beiden Schaltern „Exe-Datei“ ttnd „Objektdatei“ können Sie wählen, ob MaxonP.ASCAI-
nach jeder Übersetzung da.s Programm als atisRihrbare bzw, linkbare Datei schreiben soll. Die
Übjektdatei-Einstellung hat im Make-Modus keine Wirkung, denn dann werden die Linker-Dateien
s(.)wieso geschrieben.
2.5.3 MaxonPASCAL-Systemeinstellungen
Mit tlem zweiten Dtalogfenster, das Sie mit „System“ aus tlem „Optionen“-Menü öffnen, können
diverse Rinstellungen der .MaxonP,VSC/\I,-rnigebung vorgenommen w'erden.
2.5.3.1 Erzeugen von icons
“Icons erzeugen“ legt fest, ob .Ma.xonP,ASCAL beim Schreiben von ausführbaren Dateien, Makeftles
und Debugger-Dateien jew'cils ein Icon erzeugen soll.
o I System Clptl«i3
]:Si
_|J.cons erzeugen ’M“
>/' t Make-I>atet; Rbhting Igkelten autonatlsch setzen.-,-'".
_I Laufze»t’-£rotoko l I |prt !
firgur»ent-J,tr ing! |
Jgxfcerner flssenbter:
Debugger:
J„auf zeit »Stack!
Rutosave bei{.Bun:
Date lausuah :
IIK
J
[pasca t ! b tn/'wasH Sü. asw -c c to -u SlFI
E
IW
m
Bus .
. 'lar'
Ji 1.
Ol
RCT
•J -i-yiijai-i s
Bbbrechen |
2.5.3.2 Abhängigkeiten in Make-Dateien
Die integrierte Projektvenvaltung entscheidet souverän, w'ann welches Modul eines gröläeren
Programms neu compiliert werden muli. Dazu muK sie aber wissen, vott welchen Quelltextdateien
ein Objekt abhängig ist. Diese .Alahängigkeiten kann der Benutzer durchaus von Hand setzen -
bet|uemcr tind sicherer ist es allertlings, wenn man diese Aufgabe MPASCAl- überläKt.
Wenn sie tias Symbol „Make-Datei; Abhängigkeiten automatisch setzen“ angewählt haben,
palSt MiLxonPkSCAL beim Compilieren auf, welche Includedateien hei den einzelnen Objektdateien
gelesen w^erden, und trägt diese tltmn als Alihängigkeit in die Make-Datei ein.
MaxonPASCAL
34
2.5.3.3 ProtokoUieren von Ein- und Ausgaben
Wenn Sie tlie Option „Laujxeit-Protokoll" einschulten, werden sowohl die Ausgalxni des
Programms als auch die Eingaben des Benutzers in eine Datei geschrieben. Der Dateiname ist im
Textgadgel einzutragen, wobei „prt:“, also tler Drucker, als Defaultwert vorgegeben wird.
2.5.3.4 Argumente aus der imaginären Kommandozeile
Beim Start von der Shell kann man Programmen Argumente übergeben, die in P.ASCAL mit den
Variablen „PanimeterSlr“ und „ParameterLeti“ (siche Ka|t 6.1) ausgewertet werden können. Auch
beim Programmstart aus der Encwicklungsumgebung von MaxonPASCAL kann man diese An tler
Parameterübergabe simulieren, itidem man sie im Textgadget „Argument-String“ eingibt. Diese
.Argumentzeile wird dann an aus .MaxonP.ASC.Al. gestartete Programme übergeben.
2.5.3.5 Einbindung des Maxon Assemblers
ln .MaxonP.ASC.AL beherrscht das integrierte Make auch sogenannte Regeln, die möglichenfalls auto¬
matisch angewendet werden, wenn für eine Objekidatei keine Comitileranweisung vorhanden ist.
Zwei dieser Regeln sind sogar schon „eingebaut": Zum einen die „.p.o“-Regel, die besagt, dalä eine
auf „.o“ endende Datei, zu der eine „,p'‘-Datei gleichen Namens existiert, als Pascal-Programm com-
piliert werden kann, und zum anderen die „.a,sm.o“-Regel für Assemblersourcen. Diese Regel kön¬
nen Sie über das Eingabefeld „Externer Assembler“ frei bestimmen.
Default ist Pascal:Bin/masm |*.a,sm -c cl -v $*.err
Das „$*“ ward (wie immer bei Make-Regeln) durch den endungslosen Dateinamen ersetzt. .Ai.so wird
für jede auf „.o“ endende Objektdatei, für die es im Makefile keine Compileranweisung, dafiir aber
auf der Platte eine pa.s.sende „.asm“-Datei gibt, automatisch ein solcher M;ixon Assembler-Aufruf
erzeugt.
Diese Regel wird auch benutzt, wenn mit dem .Menüpuni „Text und Objekt aufnehmen“ eine auf
„.asm“ endende Quelltextdatei in das .Makefile aufgenommen wird. Auch in diesem Fall erhalten Sie
also automatisch einen passenden Assembleraufruf
Vielleicht fallt Ihnen die „-v‘'-Option auf Der Maxon Assembler ist so weit in das System integriert,
daß MaxonPASCAL die MaxonASM-Fehlerdateien inteqjretieren kann (und genau diese werden
durch erzeugt). Wenn MaxonPASCAL ein Assemblermodul auf diese weise „extern“ übersetzen
läßt, liest es anschließend diese Fehlerdatei ein und zeigt die Assemblerfehler im normalen
Compiler-Fenster an. Prima, nicht?
2.5.3.6 Debugger
Der Menüpunkt „Debugger“ ruft falls vorhanden die Ma.xonP.ASCAL-Ver,sion des MaxonSDB auf
Damit MaxonPASCAL auch weiß, was dabei zu tun ist, gibt es das Gadget „Debugger“ im System-
Einstellfenster. Hier ist die Shell-Anweisung anzugehen, die von MaxonPASCAL ausgeführt werden
Süll (bis auf den Dateinamen, denn den hängt MPASCAL einschließlich des Argumentstrings immer
automatisch an), Default ist PascabBin/MaxonSDB < > CON:0/0/640/120/MaxonSDB
2. MaxonPASCAL
35
Wie Sic sehen, wird hier gleiclizcitig das Fenster für die Ein- und Ausgaben des debuggten
Programms festgelegt.
2.5.3.7 Stackgröße
Wenn ein Programm aus MaxonPASCAI. gestartet wird, braucht es natürlicb auch einen Stack, und
im Zweifelsfall nicht zu wenig davon. Die gewün.schte Größe kann ebenfalls im „System -Requester
eingestellt werden.
2.5.3.8 Autosave
Wenn die „AM/o.' 5 flt.’e“-Option vom MaxonP.5SC,\L eingeschaltet ist, w'erden beim Start eines
Programms aus der integrierten Umgebung automatisch alle Editor-Texte abgespeichert, .sofern dies
noch nicht geschehen ist - bestimmt eine sinnvolle Maßnahme. Dieser Autosave sollte nicht mit
dem zeitabhängigen Autosave des Edward verwechselt werden.
Es gibt hier sogar gleich drei verschiedene Einstellungen:
• Aus:
Der MaxonP,\SC.5L-Autosave unterlrleibt.
• Texte sichern:
Die Texte im Editor werden nötigenfalls abgespeichert.
• Texte und Session:
Zusätzlich werden die „.SESS10N“-Dateien von Edward und MPASC.AL geschrieben. Dadurch
halx;n Sie nach einem Altsturz untl erneutem Start von MPASCAl. wieder alles so vor sich, wie es
gewesen war.
2.5.3.9 Dateiauswahlbox
Der RCT-Fileretiuester hat seine Fans (mich eingeschlossen), alter Commodore sieht es gar nicht
gern, wenn man gegen seine Richtlinien verstößt. Deshalb kann zwischen RCF- und ASL-
Dateiauswahlbox frei gewühlt werden.
2.5.4 Abspeichern der Konfigurationsdatei
2.5.4.1 Allgemeines
Wenn im aktuellen Verzeichnis keine Datei „mp.SESSlON" gefunden wird, liest MaxonPASCAL die
Einstellungen aus der Datei „S:mp.CONFIG“ (siehe auch Abschnitt 1.2.3), und wenn es die auch
nicht gibt, werden eben die internen Voreinstellungen verwendet. Mit dem Menüpunkt „Optionen
sichern“ werden alle aktuellen Einstellungen von MaxonPASCAI. (ausgenommen natürlich der
Editor-Zustand) in „S:ntp.CONFIG'' altgespeichert.
An dieser Stelle .soll noch darauf eingegangen werden, wie diese Konfigurations- und Session-
Dateien eigentlich aufgebaut sind. Zwar werden Sie darin kaum einmal etwas von Hand ändern,
aber Sie müssen es wLssen, wenn Sie über den .ARexx-Befchl „setopt“ MaxonP.\SC,\L-Einstellungen
ändern (siche 2.6.3.6)
MaxonPASCAI.
36
Die Konfigurationsdateien sind Texte mit einer beliebigen Folge von Optionen, die jeweils mit
einem beginnen.
2.5.4.2 Der Editor
Zunächst ist da ein Eintrag -X“Hdward:Edward‘'
Wie Sie sich vielleicht denken können, entnimmt MaxonPASCAI. dieser Angabe, woher der Editor
Edward geladen werden soll. Falls Edward in Ihrem System nicht unter diesem Ptad und Namen zu
finden sein sollte, können Sie diesen Eintrag ändern. Sie sollten aber nicht unbedingt versuchen, auf
diese Weise einen anderen Editor als Edward einzubinden, denn nach derzeitigem Stand beheiTscht
kein fremder Editor das kompilzierte Message-Protokoll zwisclten MaxonPASCAI- unti Edward.
Alternative Editoren können atisscbließlich über ARexx (Kapitel 2.6) integriert werden.
2.5.4.3 Fensterdaten
/Vm Anfang der Konfigurationsdatei finden Sie gewöhnlich eine ganze Reihe von Einträgen, die mit
Xn“ beginnen (wobei n eine Zahl zwischen 1 und 9 ist). Diese Daten legen Position und Größe der
Fenster von M:txonP;\SCAI- fest und sollten nie manuell verändert W'Crden.
2.5.4.4 Switches und Schalter
Die Optionen „-XIO“ bis „-X18‘‘ reprä,sentieren diverse Schalterstellungen der integrierten
MaxonP.ASCAl.-Umgebung. Es folgen jeweils stets ein Komma und die Schalterstclhing - meist „ü“
oder „1“, manchmal aber auch höhere Nummern.
Und das bedeuten diese Einträge;
-XIO: Exe-Datei automatisch erzeugen?
-XI1: Objektdatei automatisch erzeugen?
-X13: Icons erzeugen?
-X14: Protokolldatei schreiben?
■X15: Autosave (f) = .Aus", 1 = „Texte sichern“. 2 = „Texte -f Session“)
-X16: Größe des Laufzeitstacks
■X18: Dateiauswahlbüx (0 = RCT, 1 = ASL)
2.5.4.5 Stringoptionen
Die Einträge „-X20'' bis „-X23“ geben den Inhalt von vier Stringgadgets wieder und erwarten folge¬
richtig als Argument eine „so“ eingeschlo,ssenc Zeichenkette:
-X20: Name der Protokolldatei
-X21: Argumentstring bei Programmstart aus der Umgebung
■X22: A.ssentbleraufiruf
-X23: Debuggeraufruf
2. MaxonPASCAL
37
2.5.4.6 Compiler-Einstellungen
Die binären Compilerschalier werden wie folgt codiert:
Option
Aus
Ein
Subrange testen
•gr
-8
Rindexbereich
■8'
■gl
Unterbrechen
-gb
-gB
Stackgröße
-gs
-gs
Arithmet. iiberlatif
■gv
■gV
Semikolon melden
-ps
-ps
Debugger-Dateien
-bO
-b
-Make-.Mzhängigkeiten automatisch
-IllX
-niX
Linker. Großfklein egal
-Ic
-IC
Der Compiler-Arbeistspeicher ist mit tler Option „-w“ einziistellen, also z. B. „-w2ü0“ für 2ÜÜ KB^ae,
und mit „-M“ wird die Hauptdatei festgelegt. Mit den Optionen „-i" und „-u“, jeweils gefolgt von
einem Pfadnamen, wfcrden die Pfade für Incltitles bzw. Units definiert. Die Pfade können, müssen
alx'r nicht in Mifühmngszeichen eingesclilossen werden. Wollen Sie zugleich einen Kopierpfad
angeben, so sind die beiden Pfade tlurcli ein „|“ voneintmder zu trennen, z. B. „-i
Pascahincltide | ramiincliide“. Last not letist können Sie bei Bedarf auch mit der Option „-U“, gefolgt
von einem Unit-Namen, tlie Rinstelltmg „Make-Units" vornehmen. Diese Option arbeitet allerdings
inkrementeil, d. h. jedes „-U“ hängt einen weiteren Eintrag an, statt die bisherigen Einträge zu über¬
schreiben. Eine Ausnahme bildet ‘-U ,,“h Damit löscht man alle bisherigen Unitnamen. Letzteres wird
zwar in den Konfigurationsdateien nicht benutzt, ist aber vor allem dann wichtig, wenn man über
den ARexx-Pürt des Compilers Optionen verändern wäll (diese .Anmerkung bezieht sich auf den .set-
opt-Befebl aus .Abschnitt 2.6.3.6 tmtl braucht Sie im Mt.iment noch nicht zu kümmern).
2.6 Die ARexx-Schnittstelle
2.6.1 Grundlagen
Die Programmiersprache Rexx ist in ihrer Amiga-Portierung ,ARexx“ zu beachtlicher Popularität
gelangt, obwohl Rexx im Wirklichkeit doch eigentlich elier eine Script-Sprache und für „echte"
Programme ziemlich unbrauchbar ist. Der tiruntl für diesen phänomenalen Erfolg ist (einmal abge¬
sehen davon, daß .ARexx ab Workbench 2.Ü zum Liefertimfang jedes Amiga gehört), daß ARe.xx sich
in hervorragender Weise dazti eignet, Programme „von außen" zu steuern und so zum einen kom¬
plexe Abläufe zti automatisieren und zum anderen wiklfremde Programme zu einem System zu
kombinieren.
Voraussetzung tiafür ist, daß die Programme einen sogenannten .ARexx-Port besitzen. Ein .AlLexx-
Programm kann Anweisungen an eine solche Software-Schnittstelle schicken, und wenn das ent-
sprechentle Programm über einen geeigneten Befehlssatz verfügt, kann der Rexx-Programmierer
Programmfunktionen mit einem ARexx-Script fernsteuern.
MaxonPASCAl.
38
Der Editor „Edward“ besitzt eine soiche Schnittstelle, und ila Edward Anweisungen an MPASCAL
weitergeben kann, läßt sich die Compiler-L'mgebung natürlich über diesen Umw'eg steuern.
Ein Beispiel: Das ARexx-Script
ADDRESS "EDWARD” 'SendAppComm "compile"'
veranlaßt MaxonP.ASCAI„ den int Etlitor befindlichen Quelltext zu übersetzen. Voraussetzung dafür
ist natürlich, daß MaxonPASCAL zuvor gestartet wurde. Mit der ARexx-Anweisung „ADDRESS“ legt
man übrigens fest, wie der Port heißt, mit dem das Script kommunizieren soll.
Es bleibt noch die Frage offen, was man macht, wenn man MaxonPASüM, ohne Edw'ard benutzen
unii fernsteuern möchte ■ z. B. weil man einen anderen Editor bevorzugt (nahezu völlig unverständ¬
lich!) und diesen über ARexx in das MaxonPASCAL System integrieren möchte.
2.6.2 Der ARexx-Port
In Abschnitt 2,1 wurde bereits angedeutet, daß MPASCAL dafür vom CU bzw. der Shell aus mit der
Option „-r“ zu starten ist, z. B. mpascal -r
ln diesem Fall wird ein Port mit dem Namen „MAXONP.MsCAL“ eingerichtet. Falls ein solcher schon
existiert (kommt insbesondere vor, w'enn MaxonPASCAl, mehrfach gestartet wird), werden so lange
„MAXONPASCALl“, „.M3XONPASCAL2‘' usw. ausprobiert, bis ein noch nicht belegter Name gefun¬
den wird. .Mternativ können Sie auch hinter dem „-r" einen beliebigen Portnamen vorgeben, z. B.
MPASCAL -r "Bla Fasel Sülz!"
Generell werden solche Purtnamen in Gritßbuchstaben umgewandelt. Auch hier werden swtemweit
eindeutige Namen sichergestellt und ggf „BIA FASEL SÜLZll“ usw. ausprobiert.
In jeden Fall startet nun MaxonPASCAL, meldet sich und gibt zur Kontrolle den Portnamen aus.
Edward wird nicht geladen, MaxonPASC.Al, kommt im .ARexx-Modus völlig ohne ihn aus.
Wenn Sie den Default-Namen verwenden, können Sie Ihr Script also locker-flockig mit ADDRESS
„.MAXONPASCAL“ einleiten. Welche Anweisungen Ihnen dann zur Verfügung stehen, wird in den fol¬
genden Abschnitten dargesteilt. Zuvor soüten Sie aber noch erfahren, wie Sie das MaxonPASCAl.
wieder loswerden, ohne Ihren Rechner booten zu müssen. Zum einen gibt es dafür die Anweisung
„QUIE“. Das folgende kurze ARexx-Script entfernt also MPASCAL aus dem System:
Addreas "MAXONPASCAL" (juit
An dieser Stelle sehen Sie auch, daß Groß-ZKleinschreibung von Befehlen in .3Rexx generell egal ist.
Andererseits reagiert MaxonPASCAL im ARexx-Modus auch auf die üblichen Abbruchsignale. Wenn
Sie .MPASCAL aus der Shell ohne „run“ gestartet halxtn, genügt also die Tastenkombination
<Ctrl> + <C>. Falls Sie „run“ verwendet haben, können Sie mit der Sheli-Anweiung „Status“ die
Prozessnummer heraustinden und diesen Prozeß dann mit der„/)reflÄ’“-Anweisung abmurxen.
2. MaxonPASCAI.
39
2.6.3 Die ARexx-Befehle
2.6.3.1 Schließen, öffnen und Beenden
Wie bereits in 2.6.2 erläutert, kann M;ixunPASC.4L cluich die Anweisung quit beendet werden, sbut-
down scblicllt alle Fenster, die MaxonP.ASCAL gerade geöffnet hat, z. B. weil das ganze System
Iconifizert werden soll. AnscblieKend können mit reopen alle zuvor geöffneten Fenster erneut geöff¬
net werden.
2.6.3.2 Übersetzen, Starten und Ähnliches
Die ARexx-Befehle von MaxonPASCAl. entsprechen im wesentlichen den Anweisungen, mit denen
normalerweise Edward den Compiler steuert (also über ,.Send/\ppConm‘') und die folglich auch in
der „.DEF"-Datei verwendet werden. Allerdings haben einige Anweisungen hier .Argumente, die zum
Teil aber optional sind. So auch bei der wichtigsten Anweisung überhaupt; „compile“. „compile hel-
h.p“ veranlagt MaxonPASCAl., das gewohnte Compiler-Fenster zu öffnen und die Quelldatei ..hel-
lo.p“ zu übersetzen. ARexx-Neulinge sollten lieachten, daß die Anführungszeichen in diesem Fall
notwendig sind, damit ARexx „compilc“ und „helio.p“ als Teile einer zusammengehörentlen
Anweisung versteht und vollständig an MaxonPASCAl, sendet.
„compile“ ohne Dateinamen bewirkt die Compilation einer Datei namens „default.p“ - falls vorhan¬
den, Im .Make-.Modus (auch den gibt es natürlich im .ARexx-Modus) werden die Dateinamen aller¬
dings generell ignoriert und es wird stur nach der Make-Datei gearbeitet.
Die .Anweisung nin startet ein ülxasetztes Programm, falls ein solches vorliegt. Im Gegensatz zur
..normalen“ Entwicklungsumgebung wird dabei nicht automatisch compiliert, und es wird erst recht
nicht geprüft, ob eine erneute Überstzung (z. B. w'egen Veränderung von Quelltexten) nötig w'äre.
Ein mit „run“ gestartetes Programm kann mit der Anweisung break brutal abgebrochen werden.
dehiip startet in gewohnter Weise den Debugger.
2 . 6 . 3.3 Requester und Informationen
Auch unter ARexx müssen Sie nicht darauf verzichten, die zahlreichen Optionen und
Einstellmöglichkeitcn des Systems über Dialogfenster zu wählen: opsys öffnet das System-
Dialogfcnster und opcomp öffnet das Dialogfenster für die Compiler-Optionen. Das Info-Fenster
können Sie sich mit der Anweisung itifo ansehen, und nach einen Compilerdurchlauf läßt sich das
bereits geschlossene Compiler-Fenster (in dem eventuell Fehlermeldungen stehen) mit der
Anweisung errors erneut öffnen.
2.6.3.4 Make
Die Projektverwaltung steht auch im Re-xx-Modus zur Verfügung. Joacimk <üateiname>“ lädt die
angegebene Make-Datei. Wenn der Dateiname weggelassen wird, öffnet sich das
Dateiau.swahlfenster, und der Benutzer kann selbst eine Datei auswählen. Dagegen wird bei newmk
stets eine vom Anwender zu benennende neue Projektdatei angelegt. Es ist nicht möglich, hier
einen Dateinamen als .Argument zu übergeben, leavemk vergißt die geladene Make-Datei und schal¬
tet wieder in den Normal-Modus.
MaxonPASCAL
40
Zur Manipulation von Projekten stehen nur die k'iden Funktionen zur Verfügung, die sielt sinnvoll
von einem Editor aus starten lassen: „ackitx <Quelllextname>“ fügt eine neue Quelltextdatei hin¬
zu, vind „addtxohj <Quelllexlnmw>" trägt eine Quclltextdatei samt passender Objektdatei und
geeigneter Compilcranweiung in die Make-Datei ein. Dabei werden natüiiicb auch auf „.asm“
endentic Quelltexte sinnvoll behandelt.
Alle anderen Operationen kann der .Anwentler über das .Make-Dialogfenstcr vomebmen. Es wird mit
openmake geöffnet.
2.6.3.5 Schreiben von Dateien
Mit „exefile <Dateinmne>'‘ wird - falls ein übersetztes und gelinktes Programm vorliegt - eine aus-
fübiitare Programmdatei geschrieben, während „objeetflie <Dateiname>“ eine linkbare
Objekttlatei sebreibt. Bei beiden Anweisungen ist der Dateiname optional. Wird er weggela.ssen, öff¬
net sieh das Dateiauswahlfenster.
2.6.3.6 Optionen speichern und setzen
Die beiden Anweisungen „m>ecoiif <Datehuime>“ „savesession <Dateiname>“ sebreiben alle
Einstellungen in die angegebene Datei. Der einzige linier,schied ist der Default-Name, den die
Anweisungen verwenden, wenn kein Dateiname angegeben wird - dies sind nämlich ,,S:mp.config''
und „mp.SESSION“, Systemeinstellungen können aus einem ARexx-Script aber auch beliebig gesetzt
werden. Dazu tlicnt die Anweisung „selopt <Optkmen>“ Als Argument ist eine beliebig lange
Folge vtm Einstellungen erlaubt. Die.se sintl in dem Format anzugeben, in dem sie in dei' Konfig-
und in tien Session-Dateien stehen.
"setopt -X21,"hello World!" -pp -b -X10,l"
setzt tIen Argumentstring für Programmstarts auf,,hello World!'' und schaltet als Default in tIen
Pascal-Modus, aktivert die Erzeugung von Debug-Dateien und läßt bei jetler Übersetzung automa¬
tisch eine Exe-Datei schreiben.
.Alle Optionen, die die Entwicklungsumgebung betreffen, werden mit einer mit „-X“ beginnentlen
Atiweisung eingestellt und werden in Abschnitt 2.5.4 dieses Handbuchs erläutert.
2.6.3.7 Informationen über die Entwicklungsumgebung
Für elegante I.üsungen sollten Scri|H,s auch in der Lage sein, Informationen über den aktuellen
Status von MaxonP.ASCAI. zu erhalten. ..gelinfo AbWi" liefert den Namen der momentan geladenen
Make-Datei bzw. einen l,eerstring. Mit „gelinfo Sl’ATE“ erhalten Sie einen String „NONE“, „COMPI-
LED“ oder „LINKED“ und können so feststellen, ob ein übersetztes bzwe ül)ersetztes und gelinktes
Programm vorliegt. In beiden Fällen liegt er Ergebni.sstring nachher in der Variablen „RESULT“. Es
ist atich zu beachten, daß vorher mit der ARexx-Anw'cisung Options restdls die Daten Übergabe von
MaxonPASCAL in das ARexx-Programm ermöglicht wurde.
2. MiLxonPASC^VI-
41
2.6.3.8 Fehlermeldungen und Fehlerstellenansprung
Die Anweisung „etToi’scripl <äiiteinaine>“ legt ein ARcxx-Script fest, das von MaxonPASCAl^
jedesmal aufgeaifen wird, wenn der Coni|riler eine Fehlermeldung ausgibt. Diesem Script werden
als Argumente Dateiname, Zeilen- und Spaltennummer sowie die eigentliche Feltlermeldimg über¬
geben. So veranlaßt „eirorscripl eirors.i'X“ MaxonPASCAI. tei jedem folgenden Compilerfehler zu
einem Aufruf der Art:
rx errors.rx "hello.p" 8 1 "Syntax Error"
Ihr Script „errors.rx“ kann dann mit den übergebenen Daten beliebiges tun, z.B. sie in einer
Fehlerdatei altspeichern.
Ein „errorscript“-.Aufruf ohne Argument schaltet diesen Aufrufmechanismus wieder ab.
Da die Fehlerdaten schlicht an das Argument von „ernmaipt" angchängt w^erden, können Sie
trickreich auch w'eitere Argumente an das ARexx-Script übergeben:
"errorscript wagga.rx ERRORS argl! bläk"
bewirkt Aufrufe wie
rx wagga.rx ERRORS argll bläk "hello.c" ...
Analog funktionicTt die Anweisung „editscripi < Script naiTic>", die dafür gedacht ist, auch im
Rexx-Motliis Fehlerstellenansprung zu realisieren. Das angegebene Script wird aufgerulen, wenn der
Benutzer im Compiler-Fenster nach Ansprung einer Fehlerposition verlangt, und erhält als
■Argumente Dateinamen, Zeilen- und Spaltennummer, z, B.:
rx edit.rx "hello.p" 8 1
M;ixonPASCAL
42
3. Der Spezialist für viel Tipparbeit
Durch die Beispiele im vorhergehenden Kapitel haben Sie sicher auch schon den neuen Editor von
MaxonP.ASCAL kcnncngelernt. Einige Funktionen sind Ihnen bereits bekannt andere lassen sich
unschwer erraten, wenn Sie mit der Maus in tlie Programm-Menüs blättern.
Im Kapitel 2.2 haben Sie bereits ülx;r den Preprozessor des Editors gelesen, der die sehr komforta¬
ble Konfiguration (Fehlermeldungen, Tastatuitelegungen, Menüs und die bedingten Menüs) des
Editors aus einer Datei intepreiiert. Die im folgenden beschriebenen Menüfunktinnen, Menü-
Tastattirkürzel und besondere Prüffunktionen sind Bestandteil der dem Paket fliegenden
Konfigurationsdateien und können von Ihnen jederzeit auf spezielle Bedürfnisse angepaKt werden.
Eesen Sie näheres zur grundlegenden Bedienung und zur individuellen .Anpasstmg in den folgenden
Kapiteln.
3.1 Installation von Edward auf der Festplatte
Etlward wird firn Installiemn des MaxonPASCAL-Compiler-Systems auiomatiseh mitinstalliert.
3.2 Aufruf von Edward
Je nachdem, was Sie bevorzugen, läßt sich Edward sowohl aus dem CU als auch von der Workbeneh
aus starten. Für die fortgeschritteneren .Anweiulern ist hierbei vor allem interessant, welche
Parameter schon beim Start an Edw'ard übergeben werden können.
Hinweis
In Zusammenarbeit mit dem PASCAL-Compiler muß der Editor nicht extra gestartet
werden. Dies übernimmt der Compiler für Sie. Lesen Sie die beiden folgenden
Abschnitte, wenn Sie EDWARD auch unabhängig von MaxonPASCAL anwenden
möchten.
3.2.1 Start von der Workbeneh
Mn einfachsten starten Sie Edward durch Doppelklick auf sein Icon. Dieses befindet sich nach einer
normaien Installation im Verzeichnis „Edward:“ auf der von Ihnen gewähiten Partition Ihrer
Festplatte oder auf der Diskette.
Sie können Edward ebenfalls starten, wenn Sie auf das Icon einer mit Edward bearbeiteten Datei
geklickt haben.
43
3. EDWARD
Hinweis
Wie Sie Icons zu einer Datei erzeugen lassen können und was es dabei zu beachten
gilt, lesen Sie im Kapitel 3.15 „Globale Einstellungen“, insbesondere sollten Sie hier
die Bemerkungen zum „Icon Tool“ beachten,
Wenn Sie mit j^edriiekter Shift-Taste die Icons verschiedener Dateien anwählen unti daraufliin
Edward durch Doppelklick starten (Shift-Taste gedrückt lassen), so lädt Edward automatisch die von
Ihnen angewählten Dateien ein. Ängezeigt wird Ihnen allerdings nur die letzte geladene Datei.
"w Zum gleichzeitigen Bearbeiten verschiedener Dateien lesen Sie mehr im Kapitel 3-3 „Text“.
3.1.2 Start aus dem CU
Normalerweise starten Sie Edward v'on CIJ aus durch einfache Eingabe von „Edward . Falls Ihnen
das zu lang ist, so benennen Sie Edward einfach um oder Sie benutzen den „Alias“-Befehl Ihrer Shell
(Mehr dazu lesen Sie in der von Commotlore ausgelieferten Dokumentation oder in den entspre¬
chenden HotHelp-Projekten). Sie können selbstverständlich Namen von Dateien angeben, die nach
dem Start von Edward automatisch geladen werden sollen.
Nach dem Start von Edward aus dem CU erscheint die Meldung „Edward Process successfully deta-
ched“. Das bedeutet, daß Edward von nun an unabhängig vom CU als eigener Prozeß läuft. Sie kön¬
nen weiter mit dem CU arbeiten, ohne daß dieser blockiert ist und können den CU auch jederzeit
beenden.
3.2 Eingabe und Bearbeitung von Texten
Zu Beginn erläutere ich kurz die Bedeutung der Status-Anzeige, danach werde ich Ihnen die vorein¬
gestellte Tastaturbelegung erklären, so daß Sie alle üblichen Operationen tei der Eingabe eines
Textes vornehmen können. Desweiteren werde ich noch zusätzliche Möglichkeiten vorstellen, wie
Sie die Cursor-Position im Text verändern können.
3.2.1 Die Status-Anzeige
Wichtige Informationen über den gerade bearbeiteten Text erhalten Sie auf einen Blick, wenn Sic
die Titelzeile eines momentan aktiven Text-Fensters von Edward betrachten.
Ganz links erscheint dort immer iler Name des gerade bearbeiteten Textes. Anschließend folgen
zwei Zahlenangaben, die erste gibt die aktuelle Zeile an, die zweite die Spaltenposition innerhalb
dieser Zeile.
Anschließend folgen fünf durch Komma getrennte Buchstaben. Diese geben an, ob bestimmte
Optionen für den aktuellen Text aktiv sind, dann ist tler entsprechende Buchstabe groß, oder nicht
(der Buchstabe ist dann logischerweise klein).
MaxonPASCAL
44
Da.s „c“ ganz links gibt an, ob der Text seit dem Einladen oder nach dem letzten ,Abspeicbem verän¬
dert wurde (großes „C“ falls dies der Fall ist).
Da.s „f“ gibt an, daß Falten geändert wurden.
Ein großes „W“ bedeutet, daß der Text im „Word-Wrap“-Modu,s Ix-arbeitet wird.
Ein „O“ gibt an, daß nun der „OverWrite“-Modus gilt und ein großes „L“ signalisiert, daß der Text
momentan ge-‘'locked“ ist. Ge-“locked" bedeutet, der Text kann momentan nicht verändert werden.
Dies ist zum Beispiel der Fall, wenn Sie den entsprechenden Text drucken lassen.
■rsp Mehr zu den oben erwähnten Modi lesen Sie in den Kapiteln 3-8 „Das Edit-Prefs Formular“ und
3.9 „VVord-Wrap“.
3.2.2 BACKSPACE und DELETE
Die'lasten <BACKSPACE> und <DElJilT> sind wie üblich belegt. Mit <CTRL>-t-<DELETE>
können Sie die komplette aktuelle Zeile löschen.
3.2.3 UndoLine-Funktion
Edward bietet die Möglichkeit das Löschen einer Zeile oder Änderungen einer Zeile rückgängig zu
machen, falls Sie nicht schon eine weitere Zeile verändert haben.
• Geben Sie zum Test folgendes ein : „Der dumme Detlev demoliert die Damentoilette“. Fahren
Sie nun mit dem Cursor auf „Detlev'" und ändern Sie den Namen in „Dödel“. Drücken Sie nun
< CTRL > -l < U >. Daraufltin erscheint statt „Dödel“ wieder „Detlev“.
• lÄschen Sie nun die komplette Zeile mit <C'rRL>+ <DELETE>. Mit <CTRL>-f <U>
erhalten Sie die komplett gelöschte Zeile wieder zurück.
3.2.4. RETURN, ENTER und TAB
Falls Sie < RETURN > drücken und der Cursor befindet sich innerhalb einer Zeile, so wird die Zeile
an dieser Position aufgespalten. Ähnliches gilt für <EN'rER>. Drücken Sie <RETURN> oder
< ENTER > am Anfang einer Zeile, so wird vor dieser eine leere Zeile eingefUgt. Drücken Sie
< RETURN > oder <EN'rER> am Ende einer Zxile, so wird nach dieser Zeile eine leere Zeile ein¬
gefügt. Der Unterschied zwischen <RE'rURN> und < ENTER > ist, dalS < ENTER > die neu
erzeugte Zeile entsprechend der vorigen Zeile einrückt. Dies ist ein besonders für Programmierer
nützliches Verhalten, das das strukturierte Programmieren unterstützt.
Mit der <TAB>-Taste fügen Sie ein Zeichen in den Text ein, daß den Platz von 3 Leerzeichen ein¬
nimmt, Dies dient ebenfalls der besseren Strukturierung von Texten und Programmen.
Die Veränderung der TAB-Weite wird im Kapitel 3.8 über das Edit-Prefs-Formular erklärt.
3. EDWARD
45
Um die oben erkläiten Funktionen von <TAB> und <ENTER> zu testen, können Sie folgendes
ausprobieren,
• Drücken Sie dreimal die < TAB >-Taste. Wie Sie an der rechten Zahl in der Titel-Leiste des
Fensters sehen, befindet sich der Cursor nun an der Position 10 im Text, Gehen Sie nun
FOR V := ei TO e2 DO s; oder wus Ihnen beliebt ein.
• Drücken Sie nun die <RNTF;R>-Taste. Sie befinden sich nun in einer neuen Zeile und der
Cursor befindet sich wieder auf Position 10. also auf derselben Einriickungsstufe wie die vorige
Zeile.
3.2.5 Die Cursor-Tasten und der Ziffernblock
Wenn Sie die CURSOR-Tasten ganz normal drücken, also nicht in Kombination mit <.ALT>,
<CTRL> oder <S11IFT>, so bewegen Sie den Cursor wie gewohnt. Dies ist ebenfalls mit den
Tasten des ZilTernblock möglich. Diese müssen Sie allerdings in Kombination mit tler <AL1 >-Taste
tlriicken (ALT-8,4,6,2).
In Verbindung mit <AI.T> bew'egen Sie sich mit <CLIRSOR-l.eft> und <CURSOR-Right> um ein
W'ort vorwärts oder rückwiins. Mit <Cl)RSüR-i:p> untl <CURSÜR-Down> geht es jeweils vier
Zeilen nach oben bzw. unten.
Mit <SIIIFT> bewegen Sie den Cursor mit <CUKSOR-LcTt> und <CURSOR-Right> an den
Anfang bzw. das Ende tler Zeile. In Verlrindung mit <CLIRSOR-Up> und <CURSOR-Down>
bewegen Sie sich jeweils um fast eine Bildschirmseite nacli oben bzw. unten.
Mit <,ALT-PgUp> (AI.T-9) untl <A].T-PgDn> ( M.T-3) des Ziffernblocks bewegen Sieden Cursor
auf dieselbe Weise.
Mit <Ai;r-Home> (M.T-7) und <iM;r-Rntl> (,Ai;f-l) des Ziffernblock springen Sie an den Anfang
bzw'. tlas Entle des Textes,
Benutzen Sie die Tasten <8> untl <2> des Ziffernblocks in Kombination mit der linken <,AM1-
G.A-Taste>, so können Sie den Text um jew'eils eine Zeile nach oben aler unten scrollen. Dabei
bleibt der Ctirstrr an seiner Position, untl tler Text verschiebt sich unter ihm in beide Richtungen.
3.2.6 Der Schieberegler
Sie können die Position tles Cursors im Text ebenfalls mit tlem Slider an der rechten Seite des
Textfenster bestimmen. Wenn Sie vor oder hinter den Slider klicken, bew'egen Sie den Cursor
immer um eine Seite vor oder zurück.
3.2.7 Die Maus
Es ist zusätzlich möglich, den Cursor mit der Maus an eine bestimmte Ptisition zu bewegen. Dazu
bewegen Sie einfacit den Mauspfeil auf die gew'ünschte Position und drücken die linke Maustaste.
MaxonPASCAL
46
Solange Sie die linke Maustaste gedrückt halten, folgt der Cursor dem Mauspfeil, Bewegen Sie sich
an den oberen oder unteren Rand des Fensters, so scrollt der Text in die entsprechende Richtung.
Die Geschwindigkeit, mit welcher dieser Vorgang abläuft, hängt davon ab, ob sich der Mauspfeil
ganz rechts - dies entspricht einer sehr langsamen Bewegung - oder ganz links - dies entspricht
einer sehr schnellen Bewegung, - befindet.
3.3 Text
Ein Text besteht einfach aus einer oder mehreren Zeilen, die Sie eingeben oder als Datei von
Diskette oder Festplatte geladen haben.
i®- Das Laden von Dateien (=Texten) finden Sie im Kapitel 3.4 „Dateioperationen.”
Mit Edward können Sie fast beliebig viele Texte im Speicher halten, zwischen diesen umschalten
und (natürlich :■)) die Texte bearbeiten.
3.3.1 Erzeugen von Texten
• Starten Sie bitte den Pascal-Compiler oder einfach nur den Edward.
Edward hat automatisch alles Nötige unternommen, damit Sie sofort einen Text oder ein Programm
eingeben können.
• Tippen Sie nun - Mein 1. Text mit Edward - ein.
• Wir werden jetzt Edward mitteilen, daß wir einen weiteren Text bearbeiten wollen. Dazu wählen
Sie aus dem „Text“-Menü den Eintrag „Neu“. Das Fenster von Edward ist daraufhin wieder leer.
Das ist richtig, denn Sie befinden sich jetzt im zweiten Text, für den Sie eben Speicher reserviert
haben.
• Tippen Sie nun - Mein 2. Text mit Edward-ein.
Mil dem oben beschriebenen Menüpunkt köfincn Sie jederzeit Edward mitteilen, daß Sie einen wei¬
teten Text bearbeiten wollen. Verfahren Sie wie oben beschrieben und erzeugen Sie einen dritten
Text und geben daraufhin - Mein J Text mit Edward - ein.
3.3.2 Wahl eines bestimmten Textes
Um wieder zurück zum ersten Text zu gelangen, gibt es verschiedene Möglichkeiten,
• Wählen Sie den Eintrag „Vorheriger“ aus dem Text-Menü. Edward zeigt Ihnen nun die Zeile
„Mehl 2. Text mit Edward" an. Mit „Vorheriger“ wählen Sie immer den vorigen Text aus.
• Wählen Sie erneut den Eintrag „Vorheriger“ aus dem Text-Menü. Edward zeigt Ihnen nun die
Zeile „Mein 1. Text mit Edward“ an. Wir befinden uns also jetzt, wie gewninscht, wieder im
ersten Text.
47
3. EDWARD
• Wählen Sie noch einmal den Eintrag „Vorheriger“ aus dem Text-Menü. Edward zeigt Ihnen die
Zeile „Mein 3. Text mit Edward“ an. Vor dem ersten Text kann natürlich kein weiterer liegen.
Darum wählt Edward in diesem Fall den letzten Text. Sie können also mit „Vorheriger die
'l'exte der Reihe nach anwählen.
Genauso können Sie tlurch Wählen von „Nächster“ im „Text“-Menü den folgenden Text anwählen.
Haben Sie gerade den letzten Text bearbeitet, so wählt Edward in diesem Fall den ersten Text.
• Eine direkte Wahl des Textes ist ebenfalls möglich, Möchten Sie den zweiten Text bearbeiten,
dann wählen Sie einläch „Text 2“ aus dem „Text“-Menü.
3.3.3 Freigeben eines Textes
Nach der Bearbeitung eines Textes (und dem .Mrspeichern desselben) können Sie Edward mitteilen,
daß Sie diesen Text freigeben möchten.
• Wählen Sie „Löschen“ aus dem „Texf'-Menü. Edward zeigt Ihnen daraufhin die Zeile „Mein 3.
Text mit Edward“ an. Der zweite Text wurde von Edward freigegeben. Nach der Freigabe eines
Textes versucht Edwaril, den tolgenden zu w'ählen. Haben Sie den letzten Text freigegeben,
dann wählt Edward den vorigen Text für die weitere Bearbeitung aus.
Sollten Sie aus Versehen die Freigabe eines Textes eingeleitet haben, der noch nicht
abgespeichert wurde, so erscheint ein Dialogfenster mit der Frage, ob Sie diesen
Text „vergessen“ wollen. Geben Sie „Nein“ an, so wird die Operation abgebrochen,
wählen Sie „Ja“, dann gehen alle Änderungen, die an diesem Text vorgenommen
wurden, verloren!
3.3.4 Löschen des aktuellen Textes
Mit dem Eintrag „Entfernen“ aus dem „Texf-Menü können Sie alle Zeilen des aktuellen Textes
löschen und danach einen neuen Text eingeben. Der Text wird dadurch aber nicht freigegeben.
3.3.5 Drucken eines Textes
Mit dem Eintrag „Drucken“ aus dem „Projekt“-Menü teilen Sie Edward mit, daß er den Text, den
Sie momentan bearbeiten, ausdnicken soll. Während Edward diesen Text druckt, können Sie weiter¬
hin andere Texte bearbeiten und desweiteren alle Funktionen von Edward benutzen, die den aktu¬
ellen Text nicht verändern. Sie können also, während Edward Ihren Text druckt, weiterhin in die¬
sem den Cursor positionieren oder z.B. Blöcke markieren und kopieren. Das Einfügen oder
Ausschneiden von Blöcken ist dagegen nicht möglich.
MaxonPASCAL
48
W'ährcnd des Druckvorgangs erscheint ein kleines Fenster. Wenn Sie den Dmckvorgang unterbre¬
chen wollen, so schlie(:ien Sie einfach dieses Fenster.
Das Format, in welchem eine Textseite gedruckt werden soll, können Sie auf vielfältige Weise
variieren. Lesen Sie dazu niehrim Kapitel 3.IS „Globale Einstellungen“.
Hinweis
Edward gibt den Text an den Drucker aus, den Sie mit den Preferences der
Workbench gewählt haben. Sollten Sie hiermit nicht klarkommen, so schauen Sie im
Handbuch zur Workbench nach, das zu jedem Amiga mitgeliefert wird.
3.4 Dateioperationen
Hinter dem hochtrabenden Titel „Dateioperationen” verbergen sich Funktionen zum
Abspeichern tintl kiden von Texten.
3.4.1 Speichern von Texten
■Nachdem Sie im ersten Kipitel gelernt haben, wie man einen Text eingiht und bearbeitet, zeige ich
Ihnen nun. wie man einen solchen Text auf Diskette otler Festplatte ahspeichert und wie man den
Text von dort zur Bearbeitung wieder in den Editor bekommt.
Lieben Sie nun einen beliebigen Te.xt ein, z.B.: „AllesSeiende hal sein Sein im Nichl-Sein seines
Gegensatzes. “
Wählen Sie aus dem „Projckf-Menii den Eintrag „Speichern als...“. Es erscheint daraufliin ein
Dateiauswahlfenster, in tlessen Titelzeilc „Text speichern“ steht. Speichern Sie den Text unter
dem Namen „Test.TXT“ ab.
Normaleixveise wird laeim Altspeichern eines Textes für diesen ein Pictogramm erzeugt, so claK er
auch aut der Vl'orkbench sichtbar wird. Desweiteren werden einige Zusatzinformationen, die den
Text betreffen niitabgespeicbert (unter anderem die Tabulatorweite, Textlälten, etc. ). Besonders
interessant ist hierbei, dalS Etlward auch die aktuelle Cursorposition speichert. Das bedeutet, wenn
Sie einen le.xt emeut einladen, dann befindet sich der Cursor an derselben Stelle, an der Sie zuletzt
gearbeitet haben.
Das Erzeugen des Pictognimmes und das Speichern der Zusatzinformationen können Sic natür¬
lich auch abstellen. Lesen Sie hierzu das Kipitel 3.15 „Globale Einstellungen“.
1 Hinweis
Unter Umständen erscheint ein „System Request“ mit dem Hinweis, das Ihre
Diskette schreibgeschützt ist. Sorgen Sie dann dafür, das der Schreibschutz entfernt
wird oder nehmen Sie eine andere Diskette.
3. EDWARD
49
Die Bedeutung des Abspeicherns kann gar nicht oft genug betont werden. Alle
Veränderungen, die Sie seit dem letzten Abspeichern vorgenommen haben, sind ver¬
loren, wenn ein System-Absturz auftritt, der Strom ausfällt oder sonstige unvorher¬
sehbare Ereignisse eintreten. Sie können durch eine spezielle Einstellung dafür sor¬
gen, daß Edward In bestimmten Zeitabschnitten Ihre Texte automatisch abspeichert,
Prcfs/Autosave
3.4.2 Laden von Texten
Nachdem Sie nun einen Text abge,speichen haben, zeige ich Ihnen im Folgenden wie Sie diesen
Text wieder einladen.
• Wählen Sie aus dem „Text“-Menü den Eintrag „Entfernen“. Das Textfenster i.st nun leer. .Alle
Textzeilen wurden freigegeben. Dies ist nur für un.ser Beispiel notwendig.
• Wählen Sie nun ilen Eintrag „Öffnen“ aus tlem ,,Projekt''-Menü. Es erscheint wie vorher laeim
Abspeichern der Dateiauswahlfenster, ln diesem Fall steht in seiner Titelzeile aber „Text laden“.
Inden Sie den Text „Test.TXT“ wietler ein.
Hinweis
Wenn Sie einen Text einladen, wird dieser über den Inhalt Ihres aktuellen Textes
geladen. Wenn Sie dies vermeiden wollen, so sollten Sie zuerst einen neuen Text
erzeugen, bevor Sie „Öffnen“ wählen. Sollte der aktuelle von Ihnen bearbeitete Text
noch nicht gespeichert worden sein, so erscheint ein Dialog-Fenster, das Sie auf die¬
sen Umstand aufmerksam macht und mit dem Sie das Überladen dieses Textes ver¬
hindern können.
3.5. Blockoperationen
Gröbere Teile eines Textes umgruppieren oder vcrviclEiltigen zu können, ist eine der wichtigsten
Fähigkeiten eines Editors. Edward bietet Ihnen auch auf diesem Gebiet alles Nötige und einiges dar¬
über hinaus.
Ein besonders markierter Bereich eines Textes wird im tillgemeinen als ..Block" bezeichnet. Daraus
leitet sich auch der Name dieses Ka[)iiels ab.
3.5.1 Cut, Copy, Paste
Hinter den Begriffen .Ausschneiden“, „Kopieren“ und „Einfügen“ verbergen sich die elementa¬
ren Blockt tperationen.
MaxonPASCAI.
5Ü
Mir .Ausschneiden“ schneiden Sie einen markierten Block aus Ihrem Text aus und speichern ihn
in einem Zwischenspeicher ah. „Kopieren“ kopien den Block nur in den Zwischenspeicher, oline
üin auszuschneiden und „Einfügen“ fügt den Block ab der aktuellen Cursor-Position in den Text
ein.
Um eine Blockoperation ausführen zu können, mü.ssen Sie zuerst einmal einen Block markieren.
Dies geschieht indem Sie „Markieren“ aus dem ,,Block‘‘-Menü wählen. Wenn Sie nun den Cursor
bewegen, so werden Sie feststellen, daß der gesamte Textbereich zwischen der Position an der sich
der Cursor momentan befindet und dem Ort, an dem sich der Cursor befand, bevor Sie
„Markieren“ gewählt haben, invertiert dargestcllt wird. Dieser invertiert dargestellte Bereich ist der
sogenannte markierte „Block“. Alle Blockoperationen wirken sich auf diesen Bereich aus.
Wenn Sie erneut „Markieren“ wählen, wird der gesamte Text wieder nnnnal ilargestellt. Der mar¬
kierte Block wurde damit veigessen.
• Für tlie folgenden Schritte sollten Sie nun einen etwas längeren Text einladen.
• Positionieren Sie nun den Cursor in die .Mitte irgendeiner Zeile am Aifang ties Textes und
w'ählen Sie danach „Markieren“ aus dem ..Bk)ck“-Menü.
• Fahren Sie nun mit dem Cursor in irgendeine Zeile, die weiter unten liegt. Sie sehen nun einen
invertiert dargestellen Bereich.
• Wählen Sie „Ausschneident“ aus dem „Block"-Menii. Der markierte Bereich verschwindet dar¬
aufhin. Der Cursor befindet sich nun auf derselben Position, an der er sich befand, bevor Sie
„Markieren“ gewählt hatten. Rechts vom Cursor befindet sich der Rest der Zeile, auf tier sich
der Cursor befand, bevor Sie .Ausschneiden“ gewählt hatten.
Um nun die ursprüngliche Gestalt des Textes wiederhcr/ustcllen, können Sie den ausgeschnittenen
Bereich wieder in den Text einfügen. Dazu dürfen Sie den Cursor nicht bewegen.
• Wäfiien Sie „Einfügen“ aus tiem ,.Block“-.Menü. Der Cursor l'tefindet sich nun am Encfe des ein-
gefügten Bereiches. Ihr Text hat wieder seine ursjrrüngliche Gestalt.
Sie können jederzeit an anderen Positionen im Text eine Kopie des au.sgeschnittenen Bereiches cin-
fügen, indem Sie einfach ..Einfügen“ anwählen.
Wenn Sie einen bestimmten Textbereich nur kniüercn wollen, so markieren Sie den Bereich,
wählen „Kopieren“, positittnieren den Cursor an die gewünschte Stelle und wählen danach
„Einfügen“.
Zum Zwischenspeichern von Textausschnitten bedient sich Edward des Zwischenspeichers.
Dies ist eine genormte Ablage, der sich alle Programme, die für den Amiga entwickelt werden,
bedienen sollten. Falls Sie zum Beispiel ein Desktop-Publishing Programm besitzen, aber nicht
auf die komfortablen Editier-Möglichkeiten Edwards verzichten w'ollen, so können Sie sich des
Zwischenspeichers bedienen, um Texte zwischen Edward und dem DTP-Programm auszutau¬
schen. Dabei ist natürlich Voraussetzung, daß das DTP-Programm ebenfalls den
Zwischenspeicher unterstützt.
3. EDWARD
51
3.5.2 Spaltenblöcke
Eine Besonderheit im Umgang mit Blöcken bietet Ihnen Edward mit den Spaltenblöcken. Haben Sic
zum Beispiel eine Tabelle mit mehreren Spalten eingegeben und Sic wollen nun eine der Spalten
kopieren oder vertauschen, dann bewerkstelligen Sie dies unter Zuhilfenahme von Edw'ards
Spaltenblöcken.
• Geben Sie folgende Tabelle ein
Film
Bewertung
Hauptdarsteller
ITest
Allen I
1-
Slgourney Weaver
Allen II
1
Slgourney Weaver
Terminator II
1++
Arnold Schwarzenegger
Homo Faber
1
Saun Shephard
Gefährliche Liebschaften
1 +
John Malkovlc,
Glenn Close,
Michelle Pfeiffer
The Pabulous Baker Boys
1
Michelle Pfeiffer,
Jeff & Beau Bridges
Das Russlandhaus
2
Sean Connery,
Michelle Pfeiffer
Harry & Sally
1
Meg Ryan
Night on Earth
1
Wynona Ryder
Fessle mlchl
1
-
Das Wunderkind Tate
2 +
Jodle Foster
König der Fischer
2 +
Robin Williams
Hook
e
Dustin Hoffmann,
Robin William,
Julia Roberts
Sie wollen nun die Spalte „Bewertung“ mit der Spalte „Hauptdarsteller“ vertauschen.
• Fahren Sie mit dem Cursor auf das B von ..Bewertung“. Wählen Sie dann „vertikal markieren“
aus dem „Block“-Menü.
• Bewegen Sie nun den Cumor vor das R von „Robin Williams“ in der letzten Zeile, Spalte
„Hauptdarsteller“. Wählen Sie anschließend .aVusschneiden“ aus dem „Block“-Menü. Die
Spalte ..Bewertung“ ist nun verschwunden, „Hauptdarsteller“ befindet sich an deren Stelle.
• Positionieren Sie den Cursor auf das Ausimfungszeichen in der ersten Zeile der Spalte „Test“.
Wählen Sie nun „vertikal einfügen“ aus dem „Block“-Menü.
Daraufliin erscheint die Spalte „Bewertung“ wieder. Die Vertauschung hat funktioniert.
3.5.3 Laden, Speichern und Drucken
Sie können einen mit .Ausschneiden“ oder „Kopieren“ in die Zwischenablage kopierten Block
auf einfache Weise als Datei abspeichern. Dazu w'ählen Sie einfach „Block speichern“ aus dem
MaxonPASCAL
52
„Blück‘’-Meiiü. Es erscheint der Dateiauswahifenster und Sie können einen Namen für tien Block
angeben.
Wollen Sie einen so abgespeicherten Block wieder in Ihren Text einfügen, so wählen Sie „Block
einiesen" aus dem „Block“-Menü. Mit dem Dateiauswahlfenster geben Sie eine Datei an. Daraufhin
wird die angebene Datei in den Zwischenspeicher geladen. Sic können sie dann jederzeit mit
„Einfügen“ an einer beliebigen Stelle im Text einfügen.
Mit dem Menlipunkt „Block drucken“ aus dem .,Block“-Menii können Sie einen in die
Zwischenablage gespeicherten Block ausdrucken, allerdings ohne dieAusgalxt besonders zu forma¬
tieren. wie es beim Ausdruck eines ganzen Textes geschieht.
3.5.4 Einrücken
Zur Strukturierung von Texten, insbesondere von Programmen, dient das Einrücken von
Textabschnitten, die damit als zusammengehöriger Abschnitt hen'orgchobcn werden sollen. Zur
Unterstützung dieser .MalSnahmen bietet Ihnen Edward die Möglichkeit, einen markierten Bereich
von Zeilen einzuriieken.
• Geben Sie folgendes Programmfragment ein;
WHILE Count >= 0 DO
BEGIN
s;
v:sBucc(v);
count:=count -1;
END;
Um den Bereich zwischen BEGIN und END besser hervorzuheben, können Sie ihn einrücken,
• Bewegen Sie dazu den Cursor auf die Zeile nach BEGIN und wählen Sie .JMarkieren“ aus dem
„Edit“-Menii.
• Fahren Sie nun mit dem Cursor an das Ende der Zeile vor END.
.Mit <CTId.> + <CursorLeft> und <CTRL> + <CursorRighi> können Sie nun den markierten
Bereich um jew'eils einen TAB-Schritt nach rechts (xler links verschieben.
• Drücken Sie <CTRL>-t-<Cur.sorRight>. Damit haben Sie den Block um eine TAB-Position
nach rechts verschoben. Probieren Sie ruhig ein bißchen die Möglichkeiten aus, die sich mit
dem oben beschriebenen Verfahren ergeben.
3.5.5 Umwandeln in Groß- bzw. Kleinbuchstaben
Mit zwei weiteren Funktionen können Sie alle Buchstaben eines markierten Blocks in Groß- bzw.
Kleinbuchstaben wandeln lassen.
3. KDWAltD
53
• Geben Sie ,.,3lles Seiende entsteht tihne Grund, setzt sich aus Schwäche fort und stirbt durch
Zuläll.“ oder etwas was Ihnen mehr zusagt, ein,
• Markieren Sie einen Block, der vom ersten Buchstalx'n von „Seiende“ bis zum letzten
Buchstaben von „aus“ reicht.
• Wählen Sie nun „Großbuchstaben“ aus dem „F„xtras“-Menü, Augenblicklich werden alle mar¬
kierten Buchstaben in Grol^buchstabcn umgewandelt.
Wenn Sie „Kleinbuchstaben“ aus tlem „Extras“-Menü wählen, so werden entsprechend alle
Buchstaben des markierten Blocks in Kleinbuchstaben gewandelt.
3.6 Suchen und Ersetzen
Suchen und Ersetzen von Zeichenfolgen in einem Text gehören zum Standardrepertoire eines
Editors. Hier läKt Sie Edwartl natürlich nicht im Stich.
Um Ihnen tkis Arbeiten beim Suchen und Ersetzen zu erleichtern, bietet Edward zwei lixtra-Fenster
mit diversen Einstellmöglichkeiten an, über welche Sie die .'Vrbeiten beim Suchen und Ersetzen steu¬
ern. Da Sie in diesen Fenstern gewisse Eintragungen machen können, sprechen wir im folgenden
von sogenannten „Formularen“.
3.6.1 Das „Find‘‘-Formular
Ztmi Suchen eines bestimmten Begriffes betlienen Sie sich des „Find“-Formular.s,
Dieses erscheint, wenn Sie im Menü „Suchen“ den Menüpunkt „Suchen ..." wählen.
Jluc
Jüttdcaril
1 jjwiKe Mopt» i >1. i.i i
j »uefc» jucfcwliipf '_
Wir wertlen nun gemeinsam die Funktionen des .,Find“-Formulars durchsprechen.
Suchen
ln tliesem Bereich geben Sie die zu suchende Zeichenfolge ein. Nach dem Öffnen eines Find-
Formulars ist das Eingabefeld automatisch aktiv und zur Eingabe bereit. Wenn Sie die Eingabe
mit RETURN abschliessen, so verschwindet das „Find“-Formular gleich darauf und tier Cursor
wird auf die erste Stelle im Text positioniert, an der diese Zeichenfolge gefunden werden konn¬
te.
Für die Suche einer Zeichenfolge gilt es dabei Folgendes zu Iveachten:
Gesucht wird immer von der aktuellen Ctirsorposition aus. Normalerweise w'ird von dieser aus¬
gehend dann in Richtung auf das Ende des Textes hin gesucht. Konnte dabei keine
Zeichenfolge im Text gefuitden werden, tlie der gewünschten entspricht, so wird die
Suchrichtung umgekehrt. Jeder weitere Suchvorgang geht dann von der Cursorpo,sition aus
MaxonPASCAL
54
zum Beginn des Textes hin, Wird dort niclits mehr gefunden, so kehrt sich die Richtung enieut
um.
mehrere Suchbegriffe
Eine Besonderheit bietet Etiward Ihnen mit den beiden Knöpfen rechts neben dem
Texteingabefeld. Sie können insgesamt 10 verschiedene Suchmuster eingeben. Mit den Pfeilen
können Sie zwischen Ihnen umschalten.
>Älldcard
Hiermit können Sie beim Suchen sogenannte WildCards eingesetzen. .Als sog. Jokerzeichen
dient dabei der Stern An jeder Stelle an der sich in der zu suchenden Zeichenfolge ein Stern
befindet darf beim Vergleich mit einer anderen Zeichenfolge eine beliebige Teilfolge stehen.
Geben sie zum Beispiel „Co^m^e“ als zu suchende Zeichenfolge ein, so wird beim Vergleich
unter anderem „Commodore“ oder „Commttde" als gefunden erkannt.
ignoriere Groß/Klein
Wenn Sie „ignoriere GroK/Klein“ anwählen, so wird beim Suchen nicht zwischen Groß- und
Kleinbuchstaben unterschieden.
ganze Worte
Ist dieses Feld angewählt, so wird nur nach vollständigen Wörtern gesucht. Wenn Sie also die
Zeichenfolge „Kohl“ suchen, so gilt „Kühlsu[tpe“ oder „Kohldampf als nicht gefunden. Nur
„Kohl“ wird gefutiden und der Cursor entsprechend positioniert.
suche rückwärts
Hiermit können Sie die Suchrichtung jederzeit umkehren.
Suche nächsten
Mit Klick auf dieses Feld positionieren Sie den Cursor automatisch auf das nächste Vorkommen
der angebenen Zeichenkette.
3.6.2. Das „Find & Replace"-Formular
Mit dem „Find & Re|rlace“-FormuIar können Sie auf komfortable Weise Zeicbenfoigen im Text
suchen und durch andere Zeichenfolgen ersetzen lassen.
.: r...-...,.:.v.... . c.. ... f :|£D
.. . . -viu.
ii:uch«n i
--
_ _ - w i V*! lanior-l^r“« firoß/Ktaln
ftutrh#
*r-»*txen f I* t 1 Stiche
Die Bedienung des „Find & Replace“-Fürmular ist mit der des „Find''-Formular weitgehend iden¬
tisch.
3. EDWARD
55
Suchen
Geben Sic in dieses Texileld die zu siicliendc Zeichenrolge an.
Ersetzen
und in „Ersetzen“ tlie Zciclienfolge durcli welche ersetzt werden soll. Durch das Öffnen des
„Finil 8i Replace“-Fürmulars ward automatisch das Eingahefeld „Suchen“ aktiviert. Nach der
Eingabe in „Suchen“ wird automatisch „Ersetzen“ aktiviert.
mehrere Such-ZErsetzbegriffe
Mit den Knöpfen rechts neben „Suchen“ und ..Ersetzen“ können Sie zehn verschieden
Suchmuster anwählen, mit zehn verschieden Zeichenfolgen durch die diese ersetzt werden sol¬
len.
Vertauschen der Such-/Ersetzbegriffe
.Ms weitere Komfortsteigerung können Sie mit Klick auf den Knopf rechts daneben die Such-
und Ersetzungszeichenfolgen miteinander vertauschen. Falls Sie also aus Versehen zum Beispiel
„Hund" suchen und durch „Katze“ ersetzeti ließen so können sie mit Hilfe dieser Funktion das
Ganze rückgängig machen.
suche nächsten
.Mit Klick auf dieses Feld positionieren Sie den Cursor automatisch auf das nächste Vorkommen
der in „Suchen“ angebenen Zeichenkette.
ersetzen
Durch Klicken auf dieses Feld wird von der aktuellen Cursor-Position aus die in ..Suchen“ ange-
behene Zeichenfolge gesucht und, falls gefunden, durch die in „Ersetzen“ angebenene
Zeichenfolge ersetzt. Danach wird automatisch das nächste Vorkommen des Begriffes in
„Suchen“ gesucht und der Cursor darauf ptrsitioniert.
ersetze alle
Hiermit werden im gesatnten Text automatisch alle Vorkommen des in „Suchen“ angegebenen
Textes durch denin „Ersetzen“ angegebenen Textes ersetzt. Anschließend wird der Cursor auf
den Beginn des Textes positioniert.
3.6.3 Struktur-Check (Klammer-Check)
Für Programmierer (insbesondere diejenigen, die die Sprache „C“ benutzen ) kann der Strukur-
Check sehr hilfreich sein. Mit diesem läßt sich auf einfache Weise prüfen, ob für jede öffnende
Klammer in einem Ausdruck auch eine schließende Klammer vorhanden ist. Dabei werden nicht
nur die gewohnten iimden Klammern „(“ und „)“ ülxirprüft, sondern auf Wunsch auch „[“ und „]"
.sowie und „}“.
MaxonPiiSCAL
56
• Gehen Sie folgende Zeilen ein :
vold inain( void )
(
int i;
£or( i=100; i>0; i—)
{ f( i & 1 )
{ print£( "%d\n", i*i+((3*i)-10/1) );
}
}
}
• Positioniei en Sie nun den Curs(.)i' auf die öflnentle geschweifte Klammer in der weiten Zeile.
• Nun wählen Sie „Strukturkontrolle“ aus dem „Suchen“-Menü. Der Cursor wird automatLsch
auf die korrespondierentle schließende geschweifte Klammer in der letzten Zeile positioniert.
• Wenn Sic erneut „Strukturkontrolle“ wählen, tiann wird der Cursor wieder auf die öffnende
ge.schw'cifte Klammer in der zweiten Zeile gesetzt.
Die Funktion „Strukturkontrolle“ versucht immer den Cursor auf die zur Klammer unter dem
Cursor korrespondierende öflnendc oder schließende Klammer zu setzen. Sollte dies nicht möglich
sein, so meldet Edw-ard „Structures do not niatch!“. Somit können Sie bei stark verschachtelten
Funktionsblöcken in Ihren Programmen auf einfache Weise überprüfen, ob Sie zu jeder öffnenden
auch eine schließende Klammer gesetzt babeti und Sie müssen nicht erst den Compiler bemühen,
um solche leicht zu venneidenden Syntax-Fehler zu entiiecken.
Mit tlen runden Klammern in der .sechsten Zeile des obigen Beispiels können Sie die Funktion
„Strttkturkontrolle“ ausprobieren. Nehmen Sie ruhig einmal eine Klammer heraus und stellen Sie
fest, wie Edward tiarauf reagiert.
3.6.4 Compiler Error-Datei interpretieren, Fehler anspringen
Eine Besonderheit von Edward ist, dtütl er die Fehlerdateien bestimmter Compiler auswerten kann.
Sie müssen nur von Ihrem Compiler eine Fehlerdatei erzeugen las,sen und diese mit Edward laden.
Die dafür nötigen Ftitiktionen können Sie zum Beispiel auf eine Taste oder ein Menü legen. Bei
einem C-Compiler können Sie durch einlachen Aufruf von „CC >ErrorFile..." die Fehlermeldungen
in die Datei „ErrorFile“ umleiten. Wenn Sie die Fehlerdatei geladen haben, so positionieren Sie den
Ctirsor auf eine Zeile in der die Zeilennummer eines Fehlers steht. Danach wählen Sie „Gehe /u
Fehler“. Daraulliin überprüft Edward, ob die Datei, zu der tlie Fchlerbeschreibung gehört, sich
schon im S|teicher befindet. Ist dies nicht der Fall, so wird die entsprechende Datei nachgeladen.
Daraufhin ward der Cursor auf tlie Zeile positioniert, in welcher sich der angebene Fehler befindet.
Wenn Sie in einer geladenen Quelldatei einige Veräntlerungen vornehmen und dalxti Zeilen
eitifügen oder löschen, so kann „Gehe zu Fehler“ natürlich nicht mehr auf die richtige Zeile
positionieren. Sie .sollten tiaher immer die ungefähren Verschiebungen von Zeilen im Kopf
behalten.
3. EDWARD
57
3.6.5 Auf bestimmte Zeilen positionieren
Mit „Gehe zur Zeile..“ öflncii Sie ein kleiiie.s Foniiular, in dem sofort ein Feld zur Eingabe einer
Zahl bereit ist. Geben Sie die Nummer der gewünschten Zeile ein und drücken Sic <RET[IKN>.
Daratifliin versucht Edward den Cursor auf die gewünschte Zeile zu [tositionieren.
Mit „Gehe zum Anfang“ können Sie an tien Anfang eines Textes mit „Gehe zum Ende“ an das
Emle eines Textes gelangen.
3.7 Strukturieren von Texten, Lesezeichen
Programme bestehen normalewcise aus Prozeduren, die in weitere kleine Einheiten strukturiert
sind (oder zumindest sein sollten). Um ein Programm etwas übersichtlicher darstellen zu können,
bietet Ihnen Edward das Konzept der Falten an. Desweiteren können Sie bestimmte Zeilen markie¬
ren. Mit den Cursor-Tasten lassen sich so bestimmte Strukturen einer Datei leicht anw'ählen.
Ausserdem können wichtige Zeilen gemerkt und mit einem Tastendruck direkt angesprungen wer¬
den (Lesezeichen).
Hinweis iiaiiBiiiaB
Die Strukturierung eines Textes wird in der zum Text gehörigen Pictogramm-Datei
abgespeichert. Näheres hierzu erfahren Sie im Kapitel 3.15 „Globale Einstellungen“.
3.7.1 Erzeuge Falte, Zeige Falte, Entferne Falte, Zeige alle
Falten, Schließe alle Falten
Hinter dem Konzept der Falten verbirgt sich eine sehr leistungsfähige Methode zur Strukturierung
von Programm-Quelldateien.
• Geben Sie nun Ibigendes kleine Programm ein oder laiien Sie die Quelldatei eines von Ihnen
erstellten Programms ein.
Program Integration(input,output);
{ Demonstriert Prozedur- und Funktionsparameter sowie Stringtypen }
{ }
{ Es werden die Quadratfunktion nach dem Trapezsummen- und die )
{ Sinusfunktion nach dem Simpsonverfahren in wählbaren Grenzen }
{ integriert. }
Type string20=array[1..201 of char;
Function g(x:real):real;
{ "Sqr" kann nicht direkt als Parameter übergeben werden.
Grund: Der Ergebnistyp ist nicht definiert, sondern hängt vom
Parametertyp ab (integer oder real). Dies gilt auch z. B. für
"succ” und "pred". Solche speziellen Funktionen sind nicht als
aktuelle Parameter erlaubt. }
Begin
MaxonPASCAL
58
g:=sqr(x)
End;
Procedure trap(Function f(x:real);real;a,b:real; niinteger; Var
erg:real);
Var B,h:real; i:integer;
Begln
h:=(b-a)/n;
a:=0;
For i:=l to n-1 do
s! =B+f (a+i*h);
erg:=(0.5*(f (a)+f(b))+B)/n
End;
Procedure simp(Function f(x:real>:real; a,b:real; nrinteger; Var
erg:real);
Var tl,t2:real;
Begln
trap(f,a,b,n, tl); { Beachte: eine Function, die "Bimp" alB
Parameter )
trap(f,a,b,2*n, t2); { übergeben wurde, wird hier an "trap"
weitergereicht. )
erg:=(4*t2-tl)/3
End;
Procedure Tabelle
( funk, verf: string20;
Function f(y:real): real;
Procedure int
( function f (y: real):real;
xl,x2: real;
a: integer;
Var r:real
)
) ;
{ Man beachte die tolle Schachtelung: Der Prozedurparameter "int" hat
selbst wieder einen Funktionsparameter I }
Var lo,hl,e:real; l,max!1..100;
Begln
writeln{"Integral der Funktion f(x)=",funk);
writeln;
write('Grenzen: ');readln(lo,hi);
write('Anzahl: ');readln(max);
page ;
wrlteln('Integration von f(x)=',funk,■ durch ',verf,'verfahren');
writeln;
For i:=l to max do
Begln
int(f,lo,hi,i,e);
writeln(i:8,' ' ,e)
End;
3. EDWARD
59
writeln
End;
Begin { Hauptprogramm )
Tabelle< 'x*2■ , 'Trapez' ,g, trap) ;
Tabelle("sin (x) ","Simpson", sin,simp)
End.
• Bewegen Sie den Cursor auf die erste Zeile der ersten Funktion. Wahlen Sie „Markieren" aus
dem „Block“-Menü. Positionieren Sie den Cursor nun unter die letzte Zeile der Funktion.
• Jetzt wählen Sie „Erzeuge Falte“ aus dem „Falte''-Menii. Alle markierten Zeilen bis auf die erste
verschwinden nun. Vor dieser erscheint das Zeichen Der Cursor wurde ebenfalls auf diese
Zeile bewegt.
Damit halren Sie die erste Falte erzeugt. Alles, was vorher markiert war, steckt nun in der Falte. Nur
die erste Zeile ist noch sichtbar. Ein besonderes Zeichen zeigt Ihnen den Beginn der Falte an.
• Wahlen Sie nun „Zeige Falte“. Daraufliin wird tier Inhalt der Falte wieder sichtbar. Die Zeilen
innerhalb der Falte beginnen mit dem Zeichen „ | “. Die letzte Zeile einer Falte wird durch das
Zeichen kenntlich gemacht.
• Wählen Sie erneut „Erzeuge Falte“, dann wird die Falte wieder „eingeklappt" und die vorher
angezeigten Zeilen verschwinden.
• Wenn Sie „Entferne Falte“ anwählen, so verschwindet die Markierung der gefalteten ersten
Zeile, und alle „innereren" Zeilen der Falte erscheinen wieder. Diesmal allerdings unmarkiert.
Die Faltung wurde vollständig rückgängig gemacht.
'«■ „Zeige Falte“ und „Entferne Falte“ arbeiten nur, wenn der Cursor auf die erste Zeile einer
Falte positioniert wurde. „Erzeuge Falte“ faltet einen markierten Block ein oder schliel.^t eine
mit „Zeige Falte“ geöffnete Falte wieder.
• Falten Sie nun alle Prozeduren aus unserem Beispiel ein.
• Jetzt wählen Sie „Zeige alle Falten“. Daraufhin erscheinen beide gefalteten Bereiche so, alls
wäre für jeden die Funktion „Zeige Falte“ aufgerufen worden.
• Durch Wähl von „Schließe alle Falten“ wird das Ganze wieder rückgängig gemacht und nur
die erste Zeile jeder Falte ist noch sichtbar.
Mit „Entferne alle Falten“ entfernen Sie alle Falten aus Ihrem Text.
Selbstverständlich lassen sich tlie Falten ineinander schachteln. Das bedeutet, das Sie mehrere gefal¬
tete Bereiche in einer übergreifenden Falte zusammenfassen können.
Mit „Zeige innere Falten“ können Sie auf einen Schlag eine Falte mit all ihren inneren Falten öff¬
nen. „Schließe innere Falten“ macht dies rückgängig.
Mit „Entferne innere Falten“ entfernen Sie eine Faltung inklusive all ihrer Unterfaltungen.
MaxonPASCAL
60
3.7.2 Auszeichnen von Zeilen
Bestimmte Zeilen eines Dokuments txler einer Quelklatei, die Sie mit Fdwartl bearbeiten, können
Sie als besonders wichtig kennzeichnen. Diese Zeilen können auf besonders einfache Weise ange-
sjrrungen werden.
Eine Zeile wird durch die Tastenkombination <.A1,T> + <SHIFT> + <RETURN> ausgezeichnet.
Die Zeile wird daraufhin mit einem führenden .Ausrufungszeichen dargestellt. Wiederholen Sie diese
Tastenkombinaiion, so wird die Auszeichnung zuriickgenommen, und tias Ausrufungszeichen ver¬
schwindet.
3.7.3 Cursor-Bewegung
Mit zwei Tastenkombination können Sie gefalteten Zeilen sehr einfach anspringen. Mit
<CTRL> + <CURSOR_UP> wählen Sie eine vor der aktuellen Zeile liegende Zeile an, die einen
Faltenstan oder ein Faltenende darstellt. FJaenso können Sie mit <CTR1.> -f <CURSOR_DOWN >
eine nach der aktuellen Zeile liegende Zeile anspringen.
Mit <ALT>-f <SHlFT>-f <CURS0R_1:P> bzw. <ALT> + <S111FT> + <CURS0R_DÜWN>
springen Sie eine vor bzw. nach der aktuellen Zeile liegende Zeile att, die Sie ausgezeichnet hatten.
3.7.4 Lesezeichen (Bookmarks)
fleiin Arbeiten mit einem Text kommt es oft vtrr, daß man schnell verschiedene, weit auseinander¬
liegende Positionen im Text anspringen möchte, an tienen man gleichzeitig adieitet (z.B. ich ati die¬
sem Handbuch).
Eine .Möglichkeit um dies zu eneichen wäre, die entsprechenden Zeilen auszuzeichnen und dann
mit den Cursor-Tasten anzuspringen, dies hat jedoch den Nachteil, daß man unter Umständen meh¬
rere Bew'-egungen im Text machen muß, um die gewünschte Stelle zu eireichen.
ln diesem Fall gibt es aber eine weitere Besonderheit von Edward, die sogenannten ..Lesezeichen“.
Mit der linken <ALT>-Taste und einer Zahlentaste des alphanumerischen Teils der Tastatur kön¬
nen Sie eine Zeile zwischenmerken. Wenn Sie nun an eine andere Stelle des Textes fahren unti die
linke <.AMICiA>-Taste in Verbindung mit derselben Zahlentaste drücken, so springen Sie augen¬
blicklich an die alte Stelle im Text.
Mit der Standartl-Tastaturbelegung Edwards können Sie zehn Lesezeichen benutzen, theoretisch
erlaubt Ihnen Edward jedoch 65536 Lesezeichen pro Text.
• Laden Sie eine Datei ein.
• Drücken Sie die linke <.A1,T>-Taste untI die „1“.
Es erscheint in der Titelzeile des Fensters tiie Meldung „.Markierung gesetzt“.
• Fahren Sie an eine Ixtliebige andere Stelle des Textes.
3. EDWARD
61
• Drücken Sie nun die linke <AM1GA>-Taste und wietier die „!“■ Und schwupps sind Sie wie¬
der an der alten Position int Texl.
3.8 Das Edit-Prefs Formular
Mit dem „Edil Prefe“-Fornuilar, tlas Sie durch Wahl von „Edit Prefs...“ aus dem „Text^^-Menü erhalten,
können Sie für ieden Text den Sie mit Edward bearbeiten diverse Einstellungen vornehmen.
Zaiflt SpaceatL’; L
übarstet xfr'
...
IiX:_JSjTab UPljte
i 60 ► iRechiter Rar
-^3 ► (K lamriem; Ei
Auto-Indent
Wenn Sie .Auto-Indent aktivieren, wird bei der Stantlard-Tastaturbelegung auch nach DKicken
der < RETURN >-Taste die neue Zeile entsprechend der alten eingerückt, wie es nach Drücken
der <ENTER>-Taste tler Fall wäre.
'c*' Siehe auch Kapitel 3.2 „Eingabe und Bearbeitung von Texten“
Word Wrap
Durch Klick auf diesen Schalter wird tler ,,Word-Wrap''-Modus aktiviert,
ir*- üljcr den „Word-Wrap“-.Miidus erfahren Sie mehr im Kapitel 3-9. „Word-Wrap“.
Überschreiben
Ist Überschreiben angewählt, dann überschreiben Sie jeweils das Zeichen auf dem der Cureor
steht durch das neugetippte. Normttlerweise würde Edward das Zeichen einfügen. Überschrei¬
ben überschreibt dagegen die alten Zeichen.
TAB in Spaces
Ist diese 0|ttion aktiv, so wertien alle eingegeben T.ABs in einer Zeile automatisch in entspre¬
chend viele LeeKeichen umgewandell.
MaxonPASCAL
62
Zeige TABS
Zeige Spaces
Mit diesen drei Symbolen können Sie angeben, ob Tabs, Spaces und Zeilenenden einfach durcli
Leerräume ciargestellt werden sollen (Normaleinsiellung) oder besonders gekennzeichnet dar¬
gestellt werden sollen,
Übersetze CRs
Dateien von anderen Comi^utersystemen enthalten unter Umständen ein zusätzliches Zeichen
um ein Zeilenende anzuzeigen. Durch Aktivieren dieser Option wird ein solches Zeichen auto¬
matisch beim Laden des Textes entfernt.
TAB Weite
Tab Weite gibt die Anztihl von Zeichen zwischen zwei Tabularpositionen an. Sie können diesen
Abstand im Bereich 1 bis 20 w'älrlen.
Rechter Rand
Mit Rechter Rand geben Sie die Position in einer Zeile an, ab der im „Word-Wrap“-Modus umge¬
brochen werden soll.
Klammern Einzug
Der hier eingetragene Wert gibt die Anzahl TABS an, die hei einem automatischen Einzug
gesetzt werden.
OK
Wählen Sie USE, so werden die von Ihnen gewählten Einstellungen für den Text übernommen.
Falls Sie „Rechter Rand“ geändert haben, so wird der komplette Text dementsprechend neu
umformatiert und der Cursor danach auf die erste Zeile des Textes gesetzt.
Abbruch
Verwirft die von Ihnen vorgenommenen Einstellungen.
3.9 „Word-Wrap"
Zum Erstellen von Fließtexten, wie sie unter anderem für DTP-Programme benötigt werden, können
Sie Edward in dem „W'oixl-Wrap“-Modus versetzen. „W'örd-Wrap“ bezeichnet ein spezielles Verhalten
des Editors, bei dem eingegebene Zeilen beim Überschreiten einer bestimmten Länge umgebro¬
chen werden. Ein Wort, das mitten auf der Umbruchposition liegt, wird automatisch in die nächste
Zeile gezogen. W'ird diese Zeile dtidurch ebenfalls zu lang, so wird das Ganze fortgesetzt und zw'ar
bis an das Ende eines .Absatzes.
Ein Absatz w'ird dadurch gekennzeichnet, daß Sie nach der letzten Zeichenfolge des Al^satzes
<RETL'RN> drücken. Im Gegensatz zum normalen Editier-Modus von Edw'ard ist es im „W'ord-
WTap“-Modus nicht notwendig, die <RETURN>-Taste zu drücken, um eine neue Zeile zu erhalten.
3. EDWARD
63
Vielmelir erzeugt Edward automatisch beim Umbruch neue Zeilen. Sie brauchen also nur drauflos¬
zutippen. Daher stammt auch die Bezeichnung „Fließtext“.
» Die IJmbruchposition wird durcli Angabe tles rechten Randes im „F.dit Prefs’‘-Formular angege¬
ben. Der „Word-Wrap‘'-Modus kann ebenl'alls durch dieses Formular ein- und ausgeschaltet wer¬
den. Wie Sie dabei vorgehen müssen, haben Sie im Kapitel 3.8. .,Das Edit-Prefs Formular“ gele-
Im Gegensatz zu anderen Etlitoren, die einen Absatz erst durch Wahl eines bestimmten
Menüpunktes einmalig umbrechen können, formatiert Edward den Text schon während der
Eingabe. .Auch beim Löschen innerhalb eines Absatzes werden Worte aus folgenden Zeilen eines
.Absatzes wieder nachgezogen, wenn in der aktuellen Zeile durch das Ixaschen Platz für sie gew'on-
nen wurde.
Neben dem automatischen Umbruch des „Word-Wrap“-Modus können Sie einen Text auch
nachträglich umformatieren.
Hierzu wählen Sie entweder „Format Paragraph“, um einen .Absatz neu umzubrechen oder
„Format Text“, um den gesamten Text neu umzubrechen. Beide Menüpunkte befinden sich im
„Flxtras“-Menü.
3.10 Makros
Eine Besonderheit von Edward, die Ihnen viel .Arbeit erleichtern kann, ergibt sich aus der
Möglichkeit, Makros aufzeichnen und abspielen zu können.
Fast alle Aktionen, die Sie beim Editieren eines Textes ausführen, können Sic wie mit einem
Kassettenrekorder aufnehmen und bei Bedarf wiedergeben lassen. Das bedeutet, daß Sie sich alle
gleichförmigen langweiligen Vorgänge, die Sie oft wiederholen müßten, durch Makros abnehmen
lassen können.
3.10.1 Makros aufzeichnen & abspielen
Wenn Sie ein Makro aulzeichnen wollen, so wählen Sie den Menüpunkt „Aufnehmen“ aus dem
„Macro“-Menü. Darauthin werden alle folgenden Aktionen, die Sie vornehmen, aufgezeichnet. Mit
,Anhalten“ aus dem „Macrü''-Menü beenden Sie eine Aufzeichnung. ,„Abspielen“ spielt das Makro
dann für Sie ab.
• Laden Sie einen größeren Text ein.
.Angenommen Sie wollten nun zu Beginn jeder Zeile tlie Zeichenfolge „Start>“ und am Ende jeder
Zeile die Zeichenfolge „<End“ einfiigen. Normalerweise müßten Sie jedesmal an den Anfang einer
Zeile gehen, „Start>“ eintippen, dann ans Ende einer Zeile springen, „<End“ eingeben und in die
nächste Zeile gehen. Wenn Sie tlie Möglichkeiten der Makros ausnutzen, wird das Ganze für Sie sehr
viel einfacher.
MaxonPASCAL
64
• Fahren Sie mit dem Cursor in die erste Zeile Ilires Textes.
• Wiihleti Sie nun den Menüpunkt .^ufeeichnen“ aus dem „Macro"-Menü.
Alle Ibigcntlen Aktionen werden nun aufgezeichnet.
• Drücken Sie <SHIFT> + <Cursorl.efi>. Damit springen Sie an den Anfang einer Zeile.
• Tippen Sie nun „Start >“ ein.
• .Anschlies,send bewegen Sie den Cursor mit <SHlFT> + <CursorRight> an das Ende der
aktuellen Zeile.
• Geben Sie nun „< End“ ein.
• Fahren Sie mit dem Cursor eine Zeile tiefer.
• 'X'ählen Sie „Anhalten“ aus dem ,,Macro''-Menü. Damit haben Sie die Aufzeichnung beendet.
Alle Aktionen zw'ischen ,a4ufhehmen“ und ,a\nhalten“ wurden aufgezeichnet und stehen nun
zu Ihrer Verfügung.
Sic können nun iederzeit das gerade aufgezeichnete Makro abspielen.
• Wahlen Sie , „Abspielen“ aus dem „Macro“-Meiiü. Sie sehen, wie die folgende Zeile in
Sekundenbruchteilen ebenfalls mit „Start >“ tmd „< End“ eingerahmt ward. Sie können die¬
sen Vorgang nun beliebig oft wietlerholen und sich damit viel Tipparbeit ersparen.
Statt obigem zugegebenermaßen etwas sinnlosem Beispiel werden Ihnen in der Pnixis sicherlich
sehr viel nützlichere Einsatzmöglichkeiten ftir die Makrofunktionen einfallcn.
3.10.2 Makros speichern & abspielen
Die mit „Aufnehmen“ aufgezeichneten Makros stehen hier nur kurze Zeit zur Verfügung. W'enn Sic
ein neues Makro aufzeichnen otler Edward verlassen, so ist Ihr zuletzt aiifgezeichnetes Makro für
immer verloren. Damit Sie ein besonders [taktisches Makro nicht immer wieder neu aufzeichnen
müssen, bietet Ihnen Edward die Möglichkeit ein Makro abzuspeichern unti abgespeicherte Makros
enieut abzuspielen.
• Falls Sie das Beispiel aus Alischnitt I) noch nicht durchgespielt haben, so sollten Sie es jetzt tun.
Wir benötigen für die folgenden Schritte nämlich ein frisch aufgezeichnetes Makro.
• W'ählen Sie nun den Menüpunkt „Speichern als ...“ aus dem „Makro“-Menü. Es erscheint der
Dateiauswahlfenster. Speichern Sie das Makro nun unter irgendeinem Namen ab.
• Zeichnen Sie ein anderes Makro auf oder verlassen Sie Edwaril und starten ihn danach erneut.
Dies dient dazu das aktuelle Makro zu „verge.ssen“. .Mn einfachsten ist dies für Sie, w'enn Sic
irgendwelche neuen Aktionen wie in Alischnitt T) beschrieben aufnehmen.
• Waihlen Sie nun „Öffnen und abspielcn“ aus dem „.Makro.s"-Mcnü. Mit dem Dateiaus-
wahlfetister geben Sie nun das im vorletzten Schritt abges[)eicherte Makro an.
Sie werden sehen, wie Edward automatiseh die aktuelle Zeile mit „Start >“ und „< End“
umrahmt.
Somit können Sie aucli ein gespeichertes Makro beliebig oft wiederaufrufen.
Ein mit „Öffnen und abspielen“ abgespieltes Makrti lälJt sich jederzeit mit „Abspielen“ aus
dem „Makro“-Menü aufrufen. ohne ernetit gektden werden zu müssen. Ein altes von Ihnen auf¬
gezeichnetes Makro wird durch „Öffnen und abspielen“ überspielt.
cs- Im Zusammenhang mit ../Miexx" ergeben sich einige weitere Möglichkeiten. Lesen Sie dazu bitte
das Kapitel 3.17 „Etlward - Kommtinikation mit ARexx'k
3.11 Fenster
Sie wissen jetzt schon, wie man verschiedene Texte bearbeitet. Vielleicht haben Sie sich auch schon
gefragt, wie man verschiedene Texte oder mehrere Ausschnitte eines bestimmten Textes gleichzei¬
tig anzeigen kann.
Edward ermöglich dies durch die sogenannten Fenster. Was ein Fenster auf der Workbench oder im
CLl bedeutet ist klar. Bei Edwartl ist ein Fenster ein normales Amiga-Fenster verbunden mit den
Informationen, die Edward benötigt, um darin einen bestimmten Text oder Textatis,schnitt anzuzei¬
gen. Wie das genau funktioniert, erkläre ich Ihnen in den folgenden Abschnitten.
3.11.1 Erzeugen von Fenstern
Nach dem Start öffnet Edward sofort ein Fenster, in welchem Sie einen Text bearbeiten können.
• Geben Sie irgendeinen 'Fext ein.
• Wählen Sie aus dem ..Fensteri'-Menii den Eintrag „Neu“. Sie sehen kurz, wie sich ein Fenster
ülTnet. Dieses Fenster liegt gentni über dem ersten Fenster von Edward und hat auch denselben
Inhalt. Wenn Sie nur flüchtig zugeschtiut haben, werden Sie keinen Unterschied in der Anzeige
bemerkt htiben.
• ln der rechten unteren Ecke befindet sich ein Swihol mit welchem Sie die Größe des Fenster
verändern können. Halbieren Sie das Fenster in der Höhe und der Breite. Sie sehen nun, daß
darunter Ihr altes Fenster liegt.
• Verschieben Sie das Fenster in die rechte, untere Ecke.
• Wählen Sie den Eintrag „Neu“ aus dem „Text“-Menü.
• Laden Sie einen Text mit „Projekt/Öffnen“, oder geben Sie einen weiteren Text ein.
Für den weiteren Verlauf unserer ilbung sollten Sie jetzt noch ein Fenster öffnen, es verkleinern
und in die linken unteren Ecke verschieben. Danach laden Sie einen weiteren Text oder Sie geben
einfach ein paar Zeilen ein.
MaxonPASCAI.
66
3 . 11.2 Wahl eines bestimmten Fensters
Es gibt verschialcne Möglichkeiten, ein bestimmtes Fenster zu aktivieren.
• Am einfachsten fahren Sie mit dem Mauspfeil im entsprechenden Fenster an die Position im
Text, die Sie bearbeiten wollen und drücken die linke Mausta.ste. Das Fenster wird daraufliin
aktiviert und der Cursor erscheint unter dem Mauspfeil. Über das Tiefen-Gadget (bzw. bei
Kickstart 1..3 die beiden Tiefengadgets) können Sie an jedes Fenster herankommen und es tiann
wie oben beschrieben mit dem Mauspfeil aktivieren.
• Wählen Sie auf diese Weise das Fenster in tier rechten unteren Fxke an.
Ebenso wie die Texte werden auch die Fenster in einer Liste verwaltet. Auf einfache Weise können
Sie das Fenster ati der Listenposition vor oder auch nach dem momentan aktuellen wählen. Hierbei
gilt ebenfalls alles zu den Texten gesagte. Das momentan aktuelle Fenster sollte das von Ihnen
erzeugte in der linken unteren Ecke sein.
• Wählen Sie aus dem „Fenster"-Menü den Eintrag „Vorheriges“. Damit haben Sie wieder das
Fenster in der rechten, unteren Ecke aktiviert.
• Wählen Sie erneut „Vorheriges“. Die beiden kleinen Fenster sind nun plötzlich verschwunden.
Einzig das grosse Fenster, das beim Start von Edward automatisch geöffnet wurde, ist nun sicht¬
bar. Das liegt daran, daK bei einer .Aktivierung eines Fensters durch „Vorheriges“ oder
„Nächstes“ dieses immer automatisch in der Vordergrund geholt wird.
3.11.3 Schließen von Fenstern
Sie können ein Fenster auf zw'ei,Arten schließen. Entweder Sie bewegen dem Mauspfeil auf das
Schliefien-Symbol in der linken, oberen Ecke des Fensters und drücken die linke Maustaste, oder
Sie wählen den Eintrag „Schließen“ aus dem „Fenster"-.Menü, der das momentan aktive Fenster
schließt.
• .Aktivieren Sie, wie im vorigen Abschnitt beschrieben, das große Fenster.
• Schließen Sie es nun durch den „Schließen“-Menüeintrag. Nun sind nur noch die beiden klei¬
nen Fenster vorhanden.
• Schließen Sie nun das Fenster in der rechten, unteren Ecke mit dem Mauspfeil.
Vi’enn Sie nun mehrfach „Nächster“ txler „Vorheriger“ aus dem „Text“-Menü (nicht dem
„Fenster“-Menli!) wählen, dann stellen Sie fest, daß die drei verschiedenen Texte alle noch da sind,
obwohl Sie zwei Fenster geschlossen haben. Das liegt daran, daß Ix'im Schließen eines Fensters nur
die Anzeige eines Textes beendet wird. Der Text wird dadurch aber nicht freigegeben.
3. EDWARD
67
Wichtig
Wenn Sie versuchen, das letzte Fenster von Edward zu schließen, geht Edward
davon aus, daß Sie die Arbeit beenden wollen. Sollten Sie noch Texte haben, deren
Änderungen nicht abgespeichert wurden, so werden Sie durch ein Dialog-Fenster
darauf aufmerksam gemacht. Gegebenenfalls können Sie die Operation mit „Nein"
abbrechen. Wählen Sie „Ja", dann gehen alle vorher gemachten Änderungen verlo¬
ren.
Lesen Sie hierzu auch Kapitel 3-3.3 ..Freigelxai eine.s Textes“.
3 . 11.4 Arbeiten mit mehreren Ansichten eines Textes
Mit Edward können Sie sich mehrere Ansichten desselhen Textes anzeigen lassen und damit arbei¬
ten.
• Sie sollten nun nur noch ein Fenster von F.dward geölTnet haben. Sollte dies nicht der Fall sein,
so sorgen Sie bitte mit den oben beschriebenen Schritten dafür.
• Bew'egen Sie nun das Fenster in die linke, obere Ecke des Bildschirms und verändern Sie seine
Größe so. daß es die gesamte Breite und etwa ein Drittel der Höhe des Bildschirms ausfüllt.
Damit Sie die in diesem Alischnitt beschriebenen .Möglichkeiten richtig kennenlernen können, soll¬
ten Sie nun einen Text einladen oder eingeben, der etwa 100 Zeilen oder mehr umfasst.
• F.meugen Sie zwei weitere Fenster mit denselben oben beschriebenen Ausmassen und ordnen
Sie diese untereinander so an, daß es keine Überlappungen zwischen ihnen gibt.
• /'iktivieren Sie nun das mittlere Fenster und fahren Sie mit dem Cursor nach unten in die 40zig-
ste Zeile.
• Aktivieren Sie das unterste Fenster und fahren Sie mit dem Cursor in die letzte Zeile des Textes.
Sie können nun in jeder der tlrei Atisichten des Textes an t'erschiedenen Positionen Weiterarbeiten.
Der Vorteil ist, daß Sie in den beiden anderen Fenstern eine Übersicht über ganz andere Textstellen
halxm, als jene, die Sie gerade bearlieiten. Das kann Iresonders beim Erstellen von Quellcode für
eine bestimmte Programmiersprache von Vorteil sein.
Hinweis
Alle Änderungen, die Sie an einem Text vornehmen, inklusive der Löschung dessel¬
ben, werden nur in dem aktuellen Fenster auch angezeigt. Erst wenn Sie eine andere
Ansicht des Textes in einem anderen Fenster anwählen, wird auch dort die Anzeige
aktualisiert. Lassen Sie sich davon nicht verwirren.
MaxonPASCAL
68
Um Ihnen das Arbeiten mit versdiiedenen Ansiclilen eines Textes zu erleichtern, bietet Edward
zusätzliche Funktionen an.
• Schließen Sie alle Fenster bis auFeines.
• Wählen Sie nun „volle Größe“ aus dem „Fenstei-’-Mcnii.
Sie sehen, daß das letzte Fenster sich wieder auf die mttximale Größe ausdehnt. So erhalten Sie
schnell wieder den Überblick, falls ein Fenster zu klein war (xler Sie durch Schlief‘!en anderer
Fenster mehr Platz gew'onnen halx;n.
• Wählen Sie nun „horizontal teilen“ aus dem „Fenster“-Menü. Daraufliin teilt sich das aktuelle
Fenster horizontal in zwei gleichgroße Fenster auf. So erhalten Sie schnell die nötigen Fenster
für verschiedene Ansichten desselben Textes. Mit „vertikal teilen“ unterteilen Sie genauso ein
Fenster vertikal in zwei gleichgroße Fenster.
3.12 Verlassen des Editors
3.12.1. Unterbrechen der Arbeit
Edward bietet Ihnen besonderen Komfon, falls Sie tlie aktuelle Aitieil an einem oder mehreren
Texten unterbrechen und den Editor verlassen wollen. Wenn Sie im „Projekt“-Menü den Eintrag
„Projekt & Ende“ wählen, so speichen Edward zu.sätzliche Informationen über alle momentan ver-
w'encieten Fenster und Texte ab. Wenn Sie Edward erneut starten, dann öffnet er automatisch
Fenster untl lädt Texte ein, so daß Sie tlie Arbeit in derselben Umgehung fortsetzen können, in der
Sie sie unterbrochen haben.
Wichtig
Falls Sie Änderungen an Texten Vornahmen, ohne diese zu speichern und daraufhin
„Projekt & Ende“ gewählt haben, so werden Sie über ein Dialog-Fenster gefragt, ob
sie diese Texte „vergessen" wollen. Antworten Sie hier mit „Nein“, dann wird die
Operation abgebrochen. Wählen Sie „Ja", dann gehen die letzten Änderungen verlo¬
ren!
• Damit Sie einen kleinen Eindruck über die .Möglichkeiten der .Arbeitsunterbrechung erhalten,
sollten Sie nun Fenster mit verschiedenen Texten erzeugen.
• Wählen Sie nun den Menüpunkt „Projekt & Ende“ aus dem „Projekt"-Menü. Sie helinden sich
nun wieder auf der Workbench oder im CU, je nachdem, wie Sie Edward gestartet haben.
• Starten Sie Edward erneut. Automatisch öffnen sich die Fenster wieder so, wie Sie vor dem
Verlassen angeordnet waren untl zeigen die zuletzt bearbeiteten Texte an. Sie können nun ein¬
fach mit der .Arbeit fortfahren.
3. EDWARD
69
3.12.2 Verlassen des Editors
Im Gegensatz zu „Projekt & Ende“ verlassen Sie mit „Ende“ aus dem „Projekt“-Menü den Editor,
ohne dal.< Informationen zur momentanen Arbeitsumgebung gespeichert werden.
Wichtig
_i
Falls Sie Änderungen an Texten Vornahmen, ohne diese zu speichern und daraufhin
„Ende“ gewählt haben, so werden Sie über ein Dialog-Fenster gefragt, ob sie diese
Texte „vergessen“ wollen. Antworten Sie hier mit „Nein“, dann wird die Operation
abgebrochen. Wählen Sie „Ja“, gehen die letzten Änderungen verloren!
3.13 Iconify & HotKey
3.13.11conify
Bemitzeu Sie Etlward auf dem Workbench-Screen, so wiixl es manchmal sehr lästig sein, wenn
Etiward mit seinen Fenstern etwas im Hintergrund verdeckt. Vielleicht wollen Sie einfach ein
Pnrgramm von der Workbench aus starten oder in der Shell den Compiler anwerfen. Damit Sie sich
nicht durch alle Fenster Edwards tlurchklicken müssen, gibt es die Funktion Ikonifizieren
Wählen Sie einfach aus dem „Fenster“-Menü tlen Eintrag „Ikonifizieren“. Schon verschwanden alle
Fenster, und es erscheint links oben auf dem Bildschirm ein Fenster, das nur aus einer Titelzeile
besteht. In dieser steht „Iconified Edward“. Edw'ard ist nun nicht mehr aktiv. Das kleine Fenster
künnnen Sie irgendwohin schieben, wo es Sie nidit stören kann.
Wollen Sie Edward waeder aktivieren, so haben Sie zwei Möglichkeiten. Die zw'eite wird im .Alischnitt
HotKey beschrielx.'n.
Die erste Möglichkeit besteht darin, das Fenster mit dem Titel „Iconified Edward“ zu aktivieren
und dann die rechte Maustaste zu drücken. Daraufhin baut Edwaird wieder alle seine Fenster auf
und Sie können Weiterarbeiten.
3.13.2 HotKey
Um Etlward nach einem Iconify wieder aktivieren zu können, oder um einfach das Fenster mit dem
zuletzt bearbeiteten Text in den Vordergamd zu bekommen, gibt es den HotKey.
Der HtttKey ist eine Taste in Veitindung mit bestimmten Qualifiern ( SlllFT, ALT, CTRL, LEFT_AM1-
GA ). Wird diese Taste gedrückt, so wird das Fenster mit dem zuletzt bearbeiteten Text und der
Bildschirm auf dem sich dieses Fenster befindet in den Vordergrund gebracht. War Edw'ard im
Iconify-Zustand, so wird dieser aufgehoben, und alle Fenster w'erden wieder geöffnet.
^ Näheres zur Dennition des HotKeys erfahren Sie im Kapitel .3.16 „Benutzerdefinierte Menüs,
Tastatuitelegung untl HotKey“.
MaxonPASCAL
70
4.14 Der Kommandozeilen-Interpreter
Die Bedienung Edwards über Menüs und Formulare slellt für den Anfänger sicherlich eine große
Erleichteiung dar, der Profi ist in vielen Fällen jedoch bereit auf diesen Komfort zu verzichten, w'enn
er nur besonders schnell die wichtigsten Funktionen benutzen kann.
Dies kann zum einen durch Definition von „Short-Cuts" wichtiger Menüpunkte und durch Belegung
von Funkeionstasten etc. geschehen. Eine weitere mächtige .Möglichkeit ist der Kommandozeilen-
Interpreter Edwards. Hier können viele Befehle und Befehlskombinationen Edwards direkt eingege¬
ben und ausgeführt werden.
Die Eingabe einer Kommandozeile leiten Sie durch die <ESC>-Ta.ste ein. Daraufhin erscheint der
Cursor in der untersten Zeile des aktiven Textfensters. Die dort angezeigte Textzeile wird durch
eine Leerzcile ersetzt, in der Sie nun Ihre Eingaben machen können. Ein erneutes <ESC> bricht
die Eingabe ab. Drücken Sie stattdessen < RETURN > oder < ENTER > w'erden die von ihnen ein-
gebenen Kommandos ausgewertet.
Mit <CTRL>-F<0> gelangen Sie ebenfalls in den Eingabemodus des Kommando-Interpreters
mit der Be,Sonderheit, daß Ihre letzte Eingabe wieder zur Verfügung steht und geändert wenJen
kann.
<CTRL> -1- <G> bewirkt eine erneute Ausführung der zuletzt eingebenen Kommandos.
t*' Weitere Informationen über den syntaktisch koirekten Aufbau einer Kommandofolge erhalten
Sie in Kapitel 3.16 „Benutzerdefinierte Menüs, Tastaturbelegung und HotKey“.
•sc Alle verfügbaren Kommandos Etlwards mit Kurzerläuterungen und Parameterbeschreibung sind
im Anhang enthalten,
3.15 Globale Einstellungen
3.15.1 Das „Globale Einstellungen"-Formular
Mit dem „Globale Einstellungen"-Formular, das sich öffnet, wenn Sie „Einstellungen...“ aus dem
„Projekf'-Menü wältlen, können Sie verschiedene Einstellungen verändern, die den gesamten Editor
betreffen.
3. EDWARD
71
0.1 ^Gtobat^ ■ ■ . . . : ■ .
Display -——
Datei ---
Ruflösuing |
Gl Confiauration Icon |
iiiii .1 ilii
Icon Jlool ICdwardiEd j
Red 10 iiliiiti ><,, < "i ’Äisiiiiäiitiiii
Green 10ijiiF’f‘‘f ■ .i.i ■liiiiliüiitisli
CjI ftuto-^Save OFF |
■*• 300 1 Ze it
_j Erste Ile Etackup
Blue 10 Slii;iS;.!....c....:..;...:!.«iit!iiliiil|iiii
Fontnane |Courier.fon|
Pf ad |t :M.bak |
[ ^ ■ - \
Font^röpe |13 |
Text
Neuer flont |
-•112 {»Sero l Ibere ich
Gl Fast Textdraw |
- Undo—Konftauration
-• 256 ► i Tiefe
f JDisplav Beep
■*•32 ►! Speicher <kB>
0.K 1 fibbruch |
Auflösung wählen
Ik'i Klick auf dieses Symbol erscheint ein Dialog-Fenster aus dem Sie die gewünschte Auflösung
auswahlen können.
Farben
Mit den folgenden Symbolen können Sie die vier Farben einstcllen, in denen die Fenster und
'l'c.xte lidwards auf einem eigenen Bildschirm dargestellt werden sollen. Diese Felder sind nur
anwählbar, wenn Sie Edward aut einem eigenen Screen betreiben! Aul tler ^X'orkbench steht
Ihnen zur Veränderung der Farlren der Frefs-Einstcller zur Verfügung.
Fontoame
ln dieses 'Fexteingabefeld können Sie den Namen des Zeichensatzes angeben, in welchem die
Texte Edwards dargestellt werden sollen.
Fontgröße
Dieses Texteingabefeld erfaßt die Fontgrölse.
Wichtig
Für den beschleunigten Bildaufbau bei der Textdarstellung mußten bei der
Entwicklung Edwards gewisse Kompromisse eingegangen werden. Daher ist es lei¬
der nicht möglich Proportional-Zeichensätze zu wählen. Sollten Sie einen falschen
Zeichensatz gewählt haben, so erfolgt keine Änderung der Textdarstellung.
Neuer Font
Durch An klicken dieses Symbols öffnet sich ein Dialog-Fenster, mit dem Sie auf komfortable
Weise den gewiin,schten Zeichensatz wählen können.
M;ixonPASCAL
72
Undo Konfiguration
Mit diesen beiden Zahlenfeldern kontrollieren Sie das Verhallen von lidward im Zusammenhang
mit der Lndo-Funktion, Mit Undo-Depth geben Sie an. wie viele Operationen, die einen Text
verändern, gemerkt werden sollen. Sollte Sie an einem Text eine .Vnzalii von Ändcrungeji vor¬
nehmen, die die.sen Wert überschreitet, so werden alte Änderungen „vergessen“. Einfache
Operationen, wie „Zeichen löschen“ oder „Neues Zeichen einfugen“ benötigen keinen
Zusatzspeicher zum Merken. Das Ausschneiden eines Blockes dagegen kann nur gemerkt wer¬
den, wenn genügend Speicherplatz bereitgestellt wurde, um den ausge.schnittenenen Block
zusätzlich speichern zu können. Würden Sie nun sehr oft Blöcke ausschneiden und kopieren,
so würde sehr viel Speicher in Anspruch genommen. Mit „UndoMem“ begrenzen Sie den
Speicherplatz, den die Undo-Funktion in .Anspruch nimmt, auf einen Maximal-Wert. Wird dieser
überschritten, st) werden alle Operationen „vergessen“, um genügend Speicher wieder freizuge¬
ben.
Wichtig
Da die Undo-Funktion für jeden Text die notwendigen Informationen zum
Rücknehmen einer Veränderung merken muß, gilt Undo-Mem auch als Wert für
jeden Text. Das bedeutet, daß Sie für jeden Text, den Sie bearbeiten, im ungünstig¬
sten Fall die Menge von „UndoMem“ zusätzlich an Speicher beanspruchen.
Mit den anschließend beschriebenen Symlx)lcn können Sie das Verhalten Edwards beim Speichern
von Dateien angeben.
Datei
Mil tliesem Blätter-Symbol geben Sie an, ob Edward beim Speichern einer Datei ein Pictogramni
anlegen („Configuration Icon“) oder darauf verzichten soll („No Icon“).
Wichtig
Nur wenn Sie die Option „Configuration Icon“ gewählt haben, werden beim Sichern
einer Datei wichtige Zusatzinformationen ebenfalls mitabgespeichert. Dazu gehören
unter anderem die aktuelle Position in Ihrem Text, der „Word-Wrap“-Modus und -
sehr wichtig - die Strukturierung des Textes durch ausgezeichnete Zeilen.
Configuration Icon
Wenn Sie ein Pictogramm zu jedem Text abspeichern las.sen, .so können Sie mit diesem
Eingabefeld bestimmen, w'elches Programm beim Doppelklick auf das Pictogramm des gespei¬
cherten Textes geladen werden soll. Im Normalfall sollte dies „Edward:Edwarri“ sein.
Auto-Save
Edward kann die von Ihnen bearbeiteten Texte nach einer bestimmten Zeitspanne abspeichem.
Mit dem Blätter-Symbol haben Sic die Wahlmöglichkeit zwischen :
3. EDWARD
73
• ,Auto-Save OFF“, das bcdeutci das automatische Abspeichern von Texten ist abgeschaltet.
• „Auto-Save“, dann speichert Edward nach der im Zeit-Feld angebenen Zeitspanne alle verän-
denen Texte automatisch ab.
• „Confirm Auto-Save“, dann fragt F.tlward vor dem automatischen Speichern von Texten um
Erlaubnis.
Zeit
Mit diesem Einsteller können Sie die Zeit in Sekunden angelaen, die verstreichen darf, bis
Edward automatisch die geänderten Texte abspeichert.
Erstelle Backup
Hiermit bestimmen Sie, ob beim Speichern einer Datei eine möglicherweLse schon voihandelte
Datei gleichen Namens in ein anderes Verzeichnis umkopiert tmd umbenaniit werden soll.
Pfad
ln diesem Eingabefeld geben Sie ein spezielles Muster tut. Dieses besteht aus dem Pfadnamen
gefolgt von einer Zeichenkette, die ein enthalten sein kann. Beim Anlegen eines Backups
einer Datei wird diese in den angebenen Pfad umkopiert. Daraufltin wird sie nach der oben
eiwähmen Zeichenkette umltenannt wobei der durch den alten Namen der Datei ersetzt
wird.
ScroUbereich
Mit ScroUbereich ist der Bereich innerhalb eines Textfensters gemeint, in dem der Cursor das
Scrollen des Textes bewirkt. Sie können den Altstand des Cursors zu den Fenster-
Randkomponenten in Prozent angeben.
Textdraw
Durch das Blatter-Symbol können Sie einsiellen, ob die Textau.sgabe mit Betriebssystem-
Funktionen oder direkt gemacht werden soll. Diese Einstellmöglichkeit erhöht die
Kompatibilität Edwards zu späteren Betriebssystem-Versionen und zu neuen Grafikkarten mit
besonderen Fähigkeiten.
Display Beep
Mit diesem Symbol lälsl sich der Display-Beep, der durch jeden Fehler erzeugt wird, abschalten.
OK
Abbruch
Mit diesen beiden Symbolen übernehmen Sie die Einstellungen des Fonnulars oder Sie brechen
den Vorgang ab.
MaxonPASCAI,
21
3,15.2 Das „Seiten format"-Formular
Mit dem „Seitenforniaf'-Menü können Sie bestimmen, wie ein Text auf dem Drucker ausgeeeben
werden soll.
fej
Kopf
—J |!i]iW»P7iITOSF^
ÜHiliiiiiiiSiitliÜjäiöliliiüliiiiiiii 1
£u0
Z 0 il 0 n bis xun Tent
□•1 Center* |
iiüliiiiSiliiiliIjiWtll Zeiten nach den Text
Gl Center (
feft P- 1 Zelten/Selte
1 _1 Fprn Feed I
J auM Rnfang
_aJL_JtJ 3c«n Ende
r!« 5 >■ i L Inker Rand
•** 8» t Rechter Rand
I TS Zeiten/Tent
__—I Fetten Überspringen
drucke £ei lennunnern
ji l 'SitiiiijiMlI i l lililii Nuwwernbere Ich
*”JLaden , . . | j.peichern.
J!L
Bbbrtich f
Kopf
Fuß
Mit diesen Gadgets geben Sie an ob eine Kopf- bzw. eine Fußzeile ausgedruckt werden soll.
Hier wird der lext für die Kopf- bzw. Fußzeile angegeben. S|x-zielle Kürzel in diesem Text wer¬
den beim Druck interpretiert. Möglich sind hier:
,,%D'' = Tag, „%M'‘ = Monat, = Jahr, „%h" = Stunde, „%m“ = Minuten und „%s“ =
Sekunden. Durch diese Kürzel kann die aktuelle Zeit Ixum Ausdruck einer Seite in der Kopf-
bzw. Fußzeile eingefügt w'erden.
Weiterhin kann durch „%p“ die Seitennummer eingefügt werden.
Zeilen bis zum Text
Gibt die Anzahl Zeilen zwischen der Kopfzeile und dem Text an.
Zeilen nach dem Text
Analog dtizu gibt dieser Einsteller die Anzahl Zeilen zwischen Text und Fußzeile an.
.Mit den Felder lechts daneben läßt sich die Kopf- bzw. Fußzeile zentriert, links- oder rechtsbün¬
dig dntcken.
Zeilen/Seite
Fhermit geben Sie an, wieviele Zeilen inklusive Kopf- und Fußzeile, sowie aller Abstände auf ein
Blatt passen.
zum Anfang
Hiermit defininieren Sie den Abstand in Zeilen vom Blattlxtginn zur ersten Zeile, die gedruckt
werden soll (Dies kann die Kopfeeile oder die erste Textzeile sein).
3. HD\>;^RD
73
zum Ende
Gibt an;ilc)g zu „zum Anfang“ den Abstand in Zeilen zum Ende des Blattes an.
Linker Rand
Der Abstand des linken Randes in Zeichen.
Rechter Rand
Die Breite einer Zeile in Zeichen.
Zeilen/Text
Dient zur reinen Information. Sie sehen, wieviele Zeilen Rir die Ausgabe des lextes übrigblei¬
ben.
Form Feed
Nach tiem Drucken aller Seiten wird ein zusätzlicher FormFeed gesendet, wenn Sie diese
Ojition aktivieren.
Falten überspringen
Hiermit geben Sie an, ob beim Druck eingelältete Zeichen übersprungen werden sollen.
drucke Zeilennummern
VX'ählen Sie diese Option an, so wird jede gedruckte Zeile durchnumeriert.
Nummernbereich
Die Stellenanzahl einer Zeilennunimer kann hier angegeben werden.
laden
Laden eines bestimmten Druckformates.
Speichern
Speichern der Einstellungen.
OK
Die Einstellungen werden übernommen.
Abbruch
Die Einstellungen werden verworfen.
3.16 Benutzerdefinierte Menüs, Tastenbelegung, HotKey
In den im Verzeichnis EDWARD: abgelegten Dateien mit der Endung „.DEF‘ befinden sich die
Definitionen für die Menüs sowie die Tastaturbelegung Edwards. Diese sind in w'eiten Grenzen ver-
äntlerbar. Der Aufbau der Definitionsdatei lehnt sich dabei an eine sehr primitive
Programmiersprache an, besitzt also eine ganz einfache Syntax. Die folgenden Abschnitte werden
Ihnen das näher erläutern.
M;ixonPASCAL
76
3.16.1 Kurze Einführung in die EBNF-Darstellung
Tja, um Ihnen tlie Syntiix der Definitionen ein biiilchen näherzubringen muß ich jetzt leider etwas
weiter ausholen und die Erweiterte-Batkus-Naur-Dai-stellung einftihren. Hinter diesem ominösen
Namen, der jedem Informatik-Studenten mehr oder weniger bekannt ist, verbirgt sieb eine
Darstellungsfomi für die Syntax von Programmiersprachen. Mächtig kompliziert ist sie deswegen
aber nicbt.
Fdne Definition beginnt immer mit dem Namen des zu Definierenden, daraulfiin folgt ein
Zeichen. An dieses schließt sich die eigentliche Definition an. Sie gibt im wesentlichen an, welche
Zeichenfolgen syntaktisch korrekt sind. Dies geschieht durch direkte Angabe von Zeichenfolgen
oder der Angabe einer anderen Definition, in der dann nacbge.schaut werden muß. Zeichenfolgen W
werden immer in Anfühnangsstrichen wiedergegeben. Jede Definition wird mit einem abge¬
schlossen.
Wort = "Mahlzeit" .
Würde die Svmtitx unser Sprache nur aus obiger Definition bestehen, so wäre die einzige syntaktisch
korrekte Zeichenfolge „Mahlzeit“. Zugegebenermaßen etwas dürftig. Mir sind allerdings
Zeitgenossen bekannt, deren Sprachschatz nicht signifikant umfangreicher ist.
KlairanerAusdruck = '• ( " Ausdruck .
Ausdruck = "Mahlzeit" .
ln diesem Beispiel nimmt die Definition von Klammerausdruck bezug auf die Definition von
Ausdruck. Der einzige korrekte Klammerausdaick ist „(Mithlzeit)“.
Um anzuzeigen, daß mehrere Zeichenfolgen einer Definition genügen, dient folgende Notation :
Name = (... | ...J. wobei.“ für eine Zeichenfolge oder eine andere Definition steht.
Beispiel 3:
Wunsch = ( "Guten Appetit" | KlaanmerAuedruck ) .
KlammerAuadruck = "(" Ausdruck ")" .
Ausdruck = "Mahlzeit" .
Ein Wunsch kann laut dieser Definition entweder aus der Zeichenfolge „Guten Appetit" oder der
Zeichenfolge „(Mahlzeit)“ bestehen.
Die bisher erwähnten Beschreibungsmöglichkeiten Rir die Syntax einer Sprache würden schon aus¬
reichen, aber um Schreibarbeit zu ersparen, worden noch einige Abkürzungsmöglichkeiten geschaf¬
fen.
Steht auf der rechten Seite einer Definition ein Ausdaick in eckigen Klammem, so bedeutet dies,
daß der Inhalt der Klammern stehen kann oder auch nicht.
3. EDWARD
77
Beispiel 4:
Satz : "Jetzt geht es " ["endlich "] "zur Sache."
Die beitlen korrekten Zeichenfolgen wären : Jetzt geht es zur Sache," und Jetzt geht es endlich zur
Sache."
Eine letzte Schreihweise hedient sich der geschweiften Klammern. Ein Ausdruck in geschweiften
Klammem kann beliehigoft oder auch gar nicht stehen,
Beispiel 3:
Satz : "Hallo " {"Echo "} "."
Korrekte Zeichenfolgen wären : „flallo Jlallo Echo„Hallo Echo Echo." usw..
Mit den obigen Erläuterungen sollten Sie nun den Auftiau der Definitionsdatei verstehen können.
Falls Ihnen bisher alles zu theoretisch trocken vorkam, dann sollten Sie sich einfach mal die
Definitionsdatei „Edward.DEF“ anschauen. Die Stiiiktur, die die Definitionen haben müssen, sollte
Ihnen auch tlurch einfaches Anschauen schnell klareerden.
3.16.2 Definition eigener Menüs
Die SyntiK der Menü-Definitionen ist wie folgt definiert.
Menu = "MENU" MenuTitle { MenuGroup } .
MenuGroup = "TITLE" QuotedString { Menuitem ) .
Menultem = ("ITEM" QuotedString CommandList [QuotedString] I
"EMPTY" ) .
CommandList = ( "(" Command ")" I "(" {CommandList} ")" ) .
Command = ( EdwardConimand I CommandList ) .
QuotedString ist eine Zeichenfolge zwischen zwei iloppelten .Mifühmngszeichen (z.B. „Projekt"
für das Projekt-Menü),
EdwatdCommand ist ein Kommando des Editors mit Argumenten (falls erforderlich), wie es im
iknhang „Die Kommandos des Editors" beschrieben wird.
Zur Bedeutung der einzelnen Definitionen:
Menu:
Die Menütlefinitionen in der Datei „Edward.DEF“ müssen mit dem Schlii.sselwon „MENU“ begin¬
nen. Daraufhin folgen die Definitionen der Einträge ( MenuGroup ), wobei mindestens ein Eintrag
definiert werden muE.
MenuGroup:
Eine Menü-Gruppe beginnt mit tiem Schlüsselwort „TITLE“, dem sich ein QuotedString anschließt.
[}ie Zeichenfolge des QuotedString (s.o.) gibt den Titel der Menü-Gruppe an, der erscheint, w'enn
Sie die rechte Maustaste drücken.
MaxonPASCAL
78
Auf die Angabe des QuotedSting können beliebig viele Einträge folgen.
Menuitem:
Ein Eintrag in einer Menü-Gruppe (MenuGroup ) besteht enroeder aus dem Schlüssel-Wort „EMP-
TY“, dieses dient dazu verschieden Einträge in einer Gnippe voneinander durch einen Balken zu
trennen, oder dem Schlüsselwort „ITEM“ und einigen weiteren Angaben. „ITEM“ muß in jedem
Fall ein QuotedString folgen. Dieser gibt den Text des Menü-Eintrags an, der erscheint, wenn Sie mit
der Maus die entsprechende Menü-Gruppe autklappen lassen. Daran schließt sich eine
CommandList an. Die CommandList ist eine Folge von Kommandos mit Argumenten, die Edward
versteht. Diese werden jedesmal ausgeführt, wenn Sie den entsprechenden Eintrag in einer Menü-
Gruppe mit der Maus angewählt haben.
Mit einem w'eiteren walilweisen QuotedString können Sie ein Zeichen angeben, welches als Short-
Cut dienen soll.
3.16.3 Definition der Tastaturbelegung
Keys = "KEYS" { ModeList )
ModeQualList = "("{ Mode I Qualifler I "") { KeyDef }")"
Mode = t "MODEl" | "MODE2" | "MODE3" )
Qualifier = ( "ALT" | "SHIFT" | "CTRL" | "LEPT_COMMAND" )
KeyDef = ( KeyName | QuotedString | "NP" QuotedString )
CommandList .
KeyName = {
"Fl" I "F2" I "F3" I "F4" | "F5" I "F6" | "F7" | "F8" | "F9" | "FlO" 1
"ESC" I "BACK" I "DEL" | "HELP" |
"CRSRÜP" I "CRSRDOVnSf" | "CRSRRIGHT" | "CRSRLEFT" |
"TAB" I "RETURN" | "SPACE" | "ENTER" |
"NP_NÜML" I "NP_SCRL" | "NP_PRTSC" | "NP_HOME" | "NP_UP" | "NP_PGUP" |
"NP_LEFT" I "NP_RIGHT“ | "NP_END" | "NP_DOWN" | "NP_PGDN" | "NP_INS" |
"NP_DEL" )
CommandList = ( "(" Command ")" | "(" {CommandList} ")" )
Command = ( EdwardCommand | CommandList )
QuotedString ist eine Zeichenfolge zwischen zwei doppelten Anführungszeichen
(z.B. “Projekt“ für das Projekt-Menü).
EdwardCommand ist ein Kommando des Editors mit Argumenten (falls erforderlich), wie es im
.Anhang) „Die Kommandos des Editors“ beschrieben wird.
Wie ein Tastendruck interpretiert werden soll, hängt von verschiedenen Umständen ab. Wichtig ist
zunächst einmal, ob die Taste in Kombination mit <ALT>, <CTRL>, <SF11FT> oder
<LEFT_COMMAND> (der linken <AMIGA>-Taste) betätigt wurde. <ALT>, <CTRL>,
<SMIFT> und <LEFT_COMMAND> werden auch als Qualifier bezeichnet. Für jede Ireliebige
Kombination aus diesen Qualifiern wird der Tastendruck gesondert interpretiert. Das bedeutet.
3. EDWARD
79
wenn Sie <A].T> + <F1> drücken, geschieht etwas anderes, als wenn Sie
<.\LT> + <CTR1> + < Fl > drücken. Drücken Sic eine Taste, ohne gleichzeitig eine oder mehre
Qualifier-Tasten gedrückt zu haben, so wird aucli das gesondert interpretiert. Darau,s ergeben sich
sechzehn verschiedene Möglichkeiten eine Txste zu belegen ( 2 ♦ 2 * 2 *2; (mit <ALT> und ohne
<.M.T>) »(mit <CTR1.> und ohne <CTRI.>) * (mit <SH1FT> und ohne <SHIFT>) * (mit
<1.FIT_AM1GA> und ohne <LEFT_AMIGA>)).
Das w'ar schon ganz schön kompliziert, aber es wird noch viel schlimmer.
Mit den Befehlen „SelModel“, „SetMode-^“ und „SetModej“ können Sie einen speziellen Modus set¬
zen. Ist dieser Modus gesetzt, so wird eine daraufliiii gedrückte Taste in Kombination mit allen
Qualifiem wieder speziell interpretiert. Danach wird der Modus wieder zurückgesetzt.
Wurde eine Ttiste nicht mit einer CommandList belegt, ,so w'ird beim Druck der Taste das ihr ent¬
sprechende .3SC11-Zeichen in den Text eingelügt. Das bedeutet Rir Sie eigentlich nur, daß Sie ein „a“
bekommen, wenn Sie die Taste mit dem „a“ drücken. Es sei denn, aus irgendwelchen Gründen hät¬
ten Sie diese Taste mit einer Commandl.ist belegt.
Was das alles zu bedeuten hat, muß Ihnen jetzt noch nicht sonnenklar aufgegangen sein, zumindest
können Sie jetzt einen Zusammenhang mit der oben angegebenen Syntax erkennen, den ich Ihnen
aber gerne noch etwas näher erläutere.
Keys:
Jede Definition der Tastaturbelegung muß mit dem Schlüsselwort „KEYS“ beginnen. Diesem
schliefet sich eine beliebige Anzahl von .Modeüsts an.
ModeQualList:
Bei diesem Wort sollte es jetzt bei Ihnen klingeln, ln einer ModeQualList geben Sie an, wie eine
Taste in Verbindung mit den gesetzten Modes und Qualifiem interpretiert werden soll. Nach der öff¬
nenden rtjnden Klammer “(" mit der eine ModeQualList beginnt, folgt eine beliebige Kombination
aus Mode- und Qualifier-Angaben (z.B.: “(MODE2 ALT SHIFT..." oder gar nichts.
Es schliessen sich die KeyDefs an und zum Schluß kommt die obligatorische schliessende mnde
Klammer“)“.
KeyDef:
Eine KeyDef beginnt mit der Angabe der zu belegenden Taste. Ist dies eine Sondertaste, so geben
Sie deren speziellen Namen an (alle Namen sind oben aufgeführt worden). Ansonsten müssen Sie in
einem QuotedString das Zeichen angeben, das erscheint, wenn Sie die Taste ohne irgendeinen
Qualifier drücken (also ohne <SlllFr>, <ALT>, <CTR1.> ). Befindet sich die Taste auf dem
numerischen Ziffernblock, so geben Sie vor dem QuotedString das Schlüsselwort NP ( NP für
NumeriePad = Zahlenblock) an.
Der Angabe der zu belegenden Taste folgt eine CommandList. Diese gibt die Kommandos an, die
Edward nach dem Drücken der entsprechenden Taste ausführen soll.
MaxonPAS(;AI.
80
Damit Sic nun nicht glauben, nur Nobelpreisträger köntiten die Tastaiurbelegung Edwards ändern,
werde ich Ihnen nun am Ende des Abschnittes ein paar Beispiele vorführen.
Beispiel 1: Zusammenhang zwischen Qualifiern und Taste
KEYS
(
DELETE (delets)
)
(ALT CTRL
DELETE (inaertchara “Auf 'nem PC war das das Ende" )
Mit der obigen Definition wird beim Drücken von DELETE ( Taste <DEL> ) in Verbindung mit
<-AI,T> und <CTRL> der Text ,4uf ‘nem PC war das das Ende“ ab der aktuellen Cursor-
Position eingefügt. Dieses Beispiel befindet sich schon in der Datei „Edward.DEF". Probieren Sie es
ruhig mal aus. Drücken Sie dagegen nur <DEI.>, so wird das Zeichen rechts vom Cursor gelöscht.
Beis|iiel 2 : Zusammenhang zwischen Modi und Taste
KEYS
(CTRL
"X" (SetModel)
)
(MODEl CTRL
"c" (ineertchars "EMACS Quit" )
"s" (inaertchars "EMACS Save" )
)
Obige Definition bewirkt folgendes:
Wenn Sie <CTRL> -fi- <x> drücken wird Modus 1 eingestellt. Die nächste Taste wird also gemäß
den Angaben für .Modus 1 interpretien. Danach wird automatisch wieder der Normal-Modus einge¬
stellt. Wenn Sie al.so <CTRL>-l-<x> und gleich an.schließend <CTRL>-f <C> drücken, so
wird er I ext „EMACS Quit“ rechts vom Cursor eingefügt.
Auch dieses Beispiel ist schon in der Datei „Edward.DEF“ enthalten. Sie können es daher gleich aus¬
probieren.
Sollten immer noch nicht alle Klarheiten beseitigt sein, dann laden Sie die Datei „Edward.DEF" ein¬
fach ein untl schauen sich die Definitionen an, verändern Sie auch ruhig ' mal etwas, aber vergessen
Sie nicht, sich eine Sicherheitskopie von „Edward.DEF,, anzulegen.
3.16.4 Definition des HotKeys
HotKey = "HOTKEY" Quallfier HotKeyDef
Qualifier = ( Quallfier | "ALT" | "SHIFT" | "CTRL" |
"LEFT_COMMAND" | "" ) .
( KeyName | QuotedString | "NP" QuotedString )
HotKeyDef =
3. EDWARD
81
KeyNam = (
„Fl.. I ..f2" I "F3" I "Fa" I "FS" I “Fe" I "F7" 1 "F8" I "F9" I "FlO" I
"ESC" I "BACK" 1 "DEL" I "HELP" I
"CRSRUP" I "CRSRDOWN" I "CRSRRIGHT" I "CRSRLEFT" I
"TAB" I "RETURN" 1 "SPACE" 1 "ENTER" I
"NP_NUML" I "NP_SCRL" I "NP_PRCSC" I "NP_HOME" I "NP_UP" I "NP_PGUP" I
"NP LEFT" I "NP_RIGHT" I "NP_END" | "NP_DOWN" | "NP_PGDN" I "NP_INS"
"NP_DEL" ).
Wie Sie im Kapitel 3.13 „Iconify & HoiKey“ nachlesen konnten, bnn Rdward nach Au.sführen tler
Iconify-Funktion wieder durch einen I lutKey aktiviert werden. Welche Taste als HotKey dient, wird
ehenlalls in der Datei „Edward.DEF“ angegeben. Die Syntax hierfür ist sehr einfach. Die Definition
des HotKeys beginnt mit dem Schlüssclwon „HOTKEY“. Es folgt eine Liste von Qualifiern wie z.B.
<.\LT> oder <l.EFr_.4MlGA> und schließlich wird die Taste angegeben, tlie hinfort die Rolle des
HotKeys spielen soll.
HOTKEY
CTRL ALT DELETE
Das Ixtdeutet, wenn Sie Edward in den Iconih'-Zustand geschickt haben, so können Sie Ihn durch
Drücken von <CTRL>, <.A1,T> und der <DEL>-Taste wieder aktivieren. Auf einem PC würde
diese Tastenkombination übrigens einen Soft-Reset atisführen.
3.16.5 Einladen einer neuen Definition
Normaleivveise lädt Edward die Definition der Menüs, der Tastatur, etc. gleich beim Start aus der
Datei „Edward.DEF“. Sie können aber auch später die einzelnen Definitionen äntlern, indem Sie
eine andere Definition.sdatei einladen. Dies ist durch Wahl von „Def-Datei laden“ aus dem
„Extra.s’‘-Menü mftgUch. Es erscheint dann ein Dateiau.swahlfenster, mit dem Sie eine andere
Definitionsdatei angelaen können.
3.17 ARexx - Kommunikation mit Edward
Diese Kapitel kann leider (für Sie) und zum Glück (für mich, den Autor dieses Handhuches) keine
Einführung in die Programmiersprache Rexx sein. Dies würtle den Rahmen dieses Handbuches bei
weitem sprengen.
Außerdem gibt es inzwischen genügend Sekundärliteratur zu diesem Thema. Was soll dann dieses
Kapitel, werden Sie sich fragen?
Ganz einfach: Ihnen die Möglichkeiten im Zusammenspiel zwischen Edward und ,ARe.\x aufeeigen.
;\Rexx wurde ja gerade tiazu geschaffen, die untei'schiedlich.sten Programme von außen zu steuern
und in ihren .Mrlauf einzugreifen.
iMaxonPASCAI.
82
Kclward liat auch auf diesem Gebiet eine ganze Menge zu Itieten. Das Meiste verbirgt sich jedoch
unter der Oberfläche.
Die einzige Funktion, die Sic direkt über Menüs ansprechen können, ist der .Menüpimki .„ARexx-
Befehl" aus dem „MaknV'-Menü. Wenti Sie diese Fitnktion wählen, so erscheint ein
Dateiauswahlfenster, mit welchem Sie ein .ARexx-Programm auswählen können. Dieses wird daraut-
hin ausgeführt.
Alles Vl'eitere, was sich aus dem Zusammenspiel zwischen ARexx und Edw'ard ergibt, wird erst über
die s[)eziellen Kommandos Edwards möglich, mit denen intern alle Funktionen, die Sie z.B. über die
Menüs aktivieren, ausgefühn werden. Alle diese Kommandos können auch über ARexx angespro¬
chen werden. Dazu ist es notwendig, in Ihrem ARexx-Prngramm die folgende Zeile einzufügen :
ADDRESS "EDWARD"
.'Alle folgenden Befehle, die ARexx .selbst nicht interpretieren kann, werden dann an Edward
geschickt. Welche Befehle dies sein können, erfahren Sie im Mihang) ..Die Kommandos des
Editors“. Die Befehle in diesem Anhang sind themati.sch geordnet. Im .Abschnitt XIV. des Anhangs A)
finden Sie zudem spezielle Kommandos, die nur im Zusammenspiel mit ARexx sinnvoll sind.
3.18 Zurücknehmen von Text-Änderungen
Mit den Ftttiktionen „Undo“ und „Redo“ erhalten Sie durch Edward die Retter in der Not, die Sic
w'ahrscheinlich .schon oft vermißt hatten. Wie oft hat man doch schon an einem Text etwas geän¬
dert, schnell mal was umkopien oder gelöscht und tlann festgestcllt, daß das eigentlich nicht gerade
die beste Idee war. Was dann? Natürlich könnte man den alten Text wieder einladen und von
Neuem beginnen. Wie lästig.
Zum Glück gibt es die Undo-Funktion in Etlward. Damit können Sie eine von Ihnen vorgegebene
Anzahl aller Operationen, die einen Text verändert haben, wieder rückgängig machen.
Mit „Redo“ ist es Ihnen sogar möglich, die Rücknahme der Änderungen wieder zurückzunehmen
(ganz schön komplex).
Natürlich macht Etlward das Ganze nicht umsonst.
Um sich alle Ändemngen merken zu können, braucht er Speicher. Wieviel, daß können Sie mit den
„Globale Einstellungen“ ebenso wie die .Anzithl der zu merkenden Operationen einstellen.
«ar Siehe hierzu insbesondere Kapitel 3.15 Globale Einstellungen.
Um einen kleine Eindruck der „UnDo“-Funktion zu erhalten, probieren Sie einfach das folgenden
Beispiel aus.
• Geben Sie folgende Zeile ein: „Das Nichts als Negation des Seins mit dem Potential der
Realisation der Existenz.“
Mhlen Sie nun „UnDo“ aus dem „Extras“-Menü.
3. EDWARD
83
DaraLifliin verschwindet der letzte Buchstabe, tien Sie getippt hatten.
Sie können dies wiederholen, bis irgendw'ann die Meldung „Everything is undone!" in der Titelzeile
erscheint.
• 'Ä'ählen Sie nun „ReDo“ aus dem „Extras“-Menti. Daratifliin erscheint der Buchstabe wieder,
der durch die vorige Undo-Operation gelöscht wurde.
• Auch „ReDo“ können Sie wiederholen, bis wieder die gesamte Zeile dasteht.
Vielleicht laden Sie jetzt mal einen größeren Text ein, schneiden Blöcke aus und kopieren Sie um,
löschen einige Zeilen und tippen neue Zeichen ein.
Wenden Sie dann die Tndo-Funktion an.
Auch die Undo-Funktion stößt einmal an ihre Grenzen. Wenn sehr viel Speicher zum
Merken von Textveränderungen benötigt wird, dann kann es verkommen, daß
Edward Speicher, der zum Merken älterer Veränderungen benötigt wurde, freigeben
muß. Diese Änderungen sind dann nicht mehr rückgängig zu machen.
Weiterhin können nur so viele .Änderungen gemerkt werden, wie Sie in den „Globalen Einsteller“ als
L’ndo-Tiefe angegeben haben. Kommen mehr Änderungen zusammen, so werden die ältesten
Änderungen vergessen.
4. Syntax _
4. Syntax
85
4.1 Allgemeines
4.1.1 Syntaktische Notation
ln diesem Handbuch wird als Noiation für formale Syntaxdefinitionen EBNF, Niklaus Wirths
„lixtended Backus Natir Form“, veimmdet:
"Abc" Der Text zwischen den Anführungszeichen Ist so zu übemehmen.
Abc Entweder ist hier eine andere Synttix dieses Namens einzusetzen,
oder im nachfolgenden Text steht eine Erläuterung zu diesem Punkt.
{...} Der Inhalt der Klammer kann beliebig oft, inklusive Null-mal, gesetzt
werden.
[ ... ] Der Inhalt der Klammern ist optional, d. h. er kann entweder genau
einmal gesetzt otler ersatz.los weggelas.sen werden.
(...) Runde Klammern dienen zur Gliederung und Strukturiereung des
Ausdrucks.
A I B Alternative: Entweder A oder B
Ein Beispiel:
" (" Zahl { "," Zahl ) ")"
Dies ist eine geklammerte Liste von wie auch immer gearteten Zahlen: Am Anfang muK immer eine
runde Klammer ,,(„ stehen, gefolgt von einer ersten Zahl. Danach kann man beliebig oft jeweils ein
Komma und eine Zahl schreiben, bevor man am Ende wieder eine Klammer „)“ setzt.
Folgende Zeilen würden also der Syntax genügen:
(17,4)
( 0 )
(1, 2 , 3 , 1,-5)
Wie Sie sehen, dürfen Sie auch Leerzeichen einschieben, obwohl diese nicht in der formalen Syntax
enthalten sind. Es gilit oft auch den umgekehrten Fall, wie hei der folgenden Switax (die übrigens
kein sinnvoller Teil von Pascal ist):
"BEGIN" (Bezeichner I Zahl) "END"
Hier ist zwischen „BEGIN“ und „END“ wahlweise ein Bezeichner oder eine Zahl zu setzen. Hier
MUSS man sogar zusätzliche Leerzeichen einRigen:
MaxonPASCAL
86
BEGIN42EHD
entspräche nicht der Syntax, da dies für den Compiler ein einziger langer Bezeichner wäre.
Wie ist dieses Problem formal zu lösen? SchlielSllch wollen wir nicht ständig in Syntaxnotationen
keizeichen und sonstige Trennungen einfügen.
Der Compiler analysiert den Quelltext auf zw^el Ebenen: der lexikalischen und der syntaktischen, Auf
der lexikalischen Ebene wird der Text in eine unstrukturierte Folge von Grundsymbolen unterteilt.
Solche Grundsymbole sind im wesentlichen Bezeichner, Wortsymbole, Integerzahlen, Gleitpunkt¬
konstanten, Stringkonstanten und spezielle Symbole wie z. B. das Semikolon oder der
Doppelpunkt. So würde der Compiler bei der lexiblischen Analyse „BEGIN42END“ als ein einziges
Grundsymlxrl, nämlich einen Bezeichner, erkennen, Um daraus mehrere zu machen, muß man sie
irgendwie trennen, ln Pascal dürfen zwischen Grundsymbolen beliebig viele Leerzeichen,
Zeilenenden, Kommentare usw. stehen, ohne daß der Sinn des Textes dadurch irgendwie
beeinflußt wird.
BEGIN 4 2 END
entspräche unserer Beispiel-Syntax: „BEGI.N“ ist als erstes Symbol klar zu erkennen. Es ftrlgt eine
Zahl, die zwangsläufig da endet, wo keine Ziffer mehr folgt. Somit ist auch das Symbol „END^^ klar als
solches zu identifizieren. Jetzt erst wird die syntaktische Analyse durchgefiihrt, die die
Grundsymbolfolge als korrekt erkennt.
Wenn nicht ausdrücklich anders angegeben, beschreiben EBNF-Ausdrücke in diesem Handbuch
Regeln für die syntaktische Analyse, machen alstj Aussagen über die Abfolge vtin PASCAL-
Grundsymbülen. Dadurch ist also z. B. bei unserer Beispielsyntax
"BEGIN" (Bezeichner | Zahl) "END"
inhärent klar, daß das „BEGIN“ vom nachfolgenden Grundsymbol - hier wahlweise eine Zahl oder
ein Bezeichner - getrennt sein muß, und daß andererseits zwischen den Symbolen beliebig viele
Leerzeichen, Zeilenenden, Kommentare o. ä. gesetzt werden dürfen. Des weiteren werde ich in
Zukunft nicht mehr darauf hinweisen, daß in PASCAI, die Groß-Kleinschreibung keine Rolle spielt.
4. Syntax
87
4 . 1.2 Symbole
Wie iil)cn btTL'its sn^edeutet, gibt cs in PASOM- Wort- und Spezittlsynibolc. Zunächst eine Liste der
Wortsvmbole;
.AND
,UfRAY
BEGIN
CASE
CONST
DIV
DO
DOWNTO
ELSE
END
FILE
FOR
FUNCTION
GO'1’0
IF
IN
[ABEL
MOD
NIL
NOT
OF
OR
PROCEDURE
PROGRAM
PACKED
RECORD
REPFAT
SET
SHL
SHR
THEN
TO
TYPE
LINTII,
VAR
WHILE
Wl'FH
XOR
MaxnnPASCM. woirde gegenülter dem Standard stark erweiten, was es erforderlich machte, viele
Wortsymbole zu ergänzen. Nuti können Wortsymbole nicht überdefiniert werden, wodurch es
dadurch zu Kompatiblitätsproblemen kommen könnte. Deshalb wurden nur drei „echte“
Wortsymbole hinzugenommen, nämlich XOR, SHl. und SHR. Alle anderen wmrden als sog.
Directives realisien. Sic unterscheiden sich von W'ortsymbolen dadurch, daß sie „überdefiniert“ wer¬
den können. Hier ist eine Liste dieser Directives. Der Jensen-Wirth-Standard kennt übrigens nur
eine einzige Directive, nämlich FORW'ARD.
ABSOLUTE
Expoirr
EXTERNAL
FORW'ARD
FROM
IMPLEMENTATION
IMPORT
INTERFACE
LIBRARY
MODLII.E
OTHERWISE
STATIC
STRING
UNIT
USES
Außerdem gibt es noch Spezialsymbole. Sie bestcheti stets aus einem oder zwei Zeichen, die keine
Buchstaben sind. Die folgende Liste, die übrigens genau dem Standard entspricht, enthält alle
Spezialsymibole:
( ) *
< < =
+
< >
= >
> =
MaxonPASCAL
88
Ersatzschreibweisen: (. für |
.) für ]
@ als Ersatz für (Jensen-Wirth) ist nicht möglich,
4.1.3 Das Semikolon - das ungeliebte Trennzeichen
Viele genert-te Programmierer wird es freuen, daß MaxonPASCAL so gut wie keine Semikola
erwaitet, Prmzipiell gilt, daß man sie nur da setzen muß, wo sie als Trennzeichen nötig sind. Man
sollte sie aber trotzdem setzen (zumal es der „echte“ P,\SC,AL-Freak schon fast im Cnterhew'’ul,^t.sein
tut): Zum einen kann der Compiler dann die Fehler leichter analysieren und zum anderen bleiben
die Programme dadurch kompatibel und portabel. Zudem kann und will ich nicht garantieren, daß
der Compiler ohne Semikola 100%-ig richtig arbeitet (soll heißen, daß er eventuell hier oder da
Fehler melden könntefl), die keine sintI - die Codeerzeugung dürfte dadurch unberührt bleiben).
Mit der Option „Semikolon melden“ aus dem Compiler-Requester können Sie sich die Stellen, an
denen ein fehlt, anzeigen lassen. Die Übersetzung wird dabei nicht abgebrochen.
4 . 1.4 Kommentare
Kommentare können wahlweise mit oder “(*“ beginnen und mit “}" oder "*)" enden.
Geschachtelte Komentare sind möglich.
4.1.5 Bezeichner
Bezeichner („Identifier“) dienen in P.ASC.AL dazu, Variablen, Prozeduren und vielen anderen Dingen
mehr Namen zu geben. Erlaubte Zeichen in Bezeichnern sind: - Buchstaben - Ziffern - der
Unterstrich Bei MaxonP.ASCxAL zahleti die Umlaute „ä“, „ü“, „ü“ zu den Buchstaben, nicht jedoch
tias „ß“. Das erste Zeichen eines Bezeichners kann ein Buchstabe oder das Unterstreichzeichen sein.
Formale Syntax:
Bezeichner = Buchstabe { Buchstabe | Ziffer }
Buchstabe = 'a' | -b' | ... | 'z' | 'ä' | 'ö' | 'ü' |
Ziffer = '0' | •!' | ' 2 ' \ ... | '9-
Beachten Sie bitte, daß es sich hierbei um eine lexikalische Definition handelt und daß auch hier
nicht zwischen Groß- und Kleinbuchstaben unterschieden wird. Was in der Syntax nicht zum
Ausdruck kommt: Wortsymbole wie z. B. „BEGIN“ sind keine Bezeichner.
4. Syntax
89
4.2 Programmkopf
Die Zeile ..Program..." kann entfallen. Wenn sie aber gesetzt wird, ist die Syntax folgende:
"PHOGRAM" Bezeichner [ "(" Bezeichner { Bezeichner } ")" ][ '';”a ]
im Klartext: Nach tiein Scliltisselwort.,Program“ miilS stets ein Bezeichner folgen. Optional bnn
man dann eine in mnden Klammern eingesdilo.ssene Parameterliste setzen, bestehend aus tlurch
Komma getrennten Bezeichnern.
Achtung
Der Inhalt dieser Liste wird völlig ignoriert und hat keinerlei Bedeutung! Wie fast immer, ist
auch hier das am Schluß optional.
4.3 Blöcke
Ein Block bildet in P,\SCAI. den Rumpf eines Programms hzw. einer Procedure oder Function und
besteht aus:
I.abel-Deklarationsteil
Konstanten-Definitionstcil
- Typdefinitionsteil
Variablendeklarationsteil
Procedure- und Function-Deklarationen
Bibliotheksdefinitioiicn
Anweisungsteil
Der letzte Teil ist der einzige, der immer vorhanden sein muK. alle anderen sind optionttl.
Bei MaxonP.ASCAL ist die Reihenfolge der Deklarations- und Defmitionsteile teliebig; jeder Teil
kann auch beliebig oft Vorkommen. Wichtig ist nur, daR am Faide der mit BEGIN ... END timschlos-
sene .Anweisungsteil kommt.
Folgendes wäre ein koiTcktcs MaxonP.ASCAl.-Programm:
{ "Program"-Kopf weggelaasen )
Const diff=7;
Procedure p(Var i:integer);
Begin
writeln(i); l:=i-diff
End;
Type ttyp=integer;
Var v: ttyp;
MaxonPASCAl.
90
Const con=0815(
Begin
v:=con; p(v); p(v)
End.
Der Punkt am Programmeiule ist übrigens auch nicht unlretlingt nötig.
Formal sieht das Ganze dann so aus:
Deklarationatell= { Labeldeklaration | Konstantendefinition I
Typdefinition | Variablendeklaration |
Prozedurdeklaration | Librarydefinition
Block = Deklarationsteil Anweisungsteil
Programm = [ Programmkopf ] Dses-Deklaration Block
[ ]
Zu den meisten hier auftretenden Begriffen wie „Variablcndeklaration“, „Librar>'iiefmitiün" oder
.Anweisungsteil" finden Sie im weiteren Verlauf dieses Handbuchs ausführliche Erläuterungen. Was
eine „Uses-Deklaration" ist, erfahren Sie im Kapitel über Units.
4.4 Label
Jedes Label, das benutzt wird, muß zuvor deklariert werden, Die Syntax eines Label-Deklarationsteils
ist:
Labeldeklaration = "LABEL" Marke { Marke } [ ]
Marke = Bezeichner | Ziffernfolge
Ein Label („Marke“) ist entweder eine Integer-Konstante oder ein Bezeichner. Das Label muß auf
der Ebene deklarien werden, auf der es gesetzt wird: Man darf z. B. nicht ein Label im
Hauptprogramm deklarieren und dann im Miweisungsteil einer Prozedur setzen.
4.5 Konstanten und Konstantendefinition
Syntax für Konstantendefinition:
"CONST" Name "=" Konstante { { ) Name "=" Konstante } t " ;" ]
„Name“ ist ein Bezeichner, „Konstante“ normalerweise ein Literal. .Näheres entnehmen Sie bitte den
Kapiteln über tlie jeweiligen Datentypen.
Eine Konstante kann in .MaxonPASCM. ater auch ein Ausdruck sein, in dem nur konstante
Operanden und bestimmte Ojteratoren auftreten. Im Ganzzahl-Bereich können alle einstelligen
4. Syntax
91
(NOT, -) und zweistelligen ( + , *, mod, shr, ...) Operatoren in Konstanten benutzt werden,
außerdem die folgenden Funktionen (natürlich nur mit konstanten Parametern):
Abs ehr Ord Fred SizeOf Sqr Succ
Succ, Pred und Ord werden auch hei konstanten Parametern der anderen geordneten Datentypen
(Char, Boolean, Aufzählungstypen) ausgew'ertet.
Real- und String-Ausdrücke werden nicht vom Compiler ausgewertet und können deshalb nicht als
Konstante benutzt werden. Die einzigen Operatoren, die bei Real-Konstanten erlaubt sind, sind „+“
und als Vorzeichen. Ai.so sind
Const n = 17 + 4;
nQuadrat = Sqr (n);
R = 17.4;
minusR = -R;
s = '17 plus 4';
korrekt definierte Konstanten,
Const r = 17 + 0.4; { Real-Ausdruckl }
s = ' Guide' '42'; { String-Ausdruck 1 }
jedoch nicht.
Außer in Konstantendefmitionen treten Konstanten noch an einigen anderen Stellen auf, z. B, in
Typdeklarationen (Ausschnittstepen, z. B. als ARR.AY-lndextyp) und als Sprungmarke in der C'kSE-
Anweisung.
.Auch hier gelten die selben Regeln für Konstanten-Ausdrücke, so daß also Deklarationen wie
VAR Feld: Array [1. .40-I-2] of Set of 0 .. 1 shl 6 - 1;
erlaubt sind.
4.6 Typdefinition
ln PASC-AL kann man sich Datentypen selbst definieren. Um nicht immer wieder dieselbe
Typbeschreibung schreiben zu müssen, kann man dem Daientyiien einen Namen geben. Dies
geschieht im Typ-Definiiionsteil eines Blocks: Auf der linken Seite eines Gleichheitszeichens steht
der gewünschte Name, auf der rechten Seite die Typbeschreibung. Von dieser Stelle an ist der defi-
niene Typ unter diesem Namen im aktuellen Block verfügbar.
Syntax für Typdefinitionsteil;
"TYPE" Name "=" Typ t [ ";" ] Name "=" Typ } [ ";" 1
Den zahlreichen Datentypen ist ein Extra-Kapitel dieses Handbuchs gewidmet.
MaxonPASCAL
92
4.7 Variablendeklaration
Jede Variable, die benutzt wrd, muß zuvor deklariert werden. Dies ge.sehieht im Variablen-
DekJarationsteil eines BJr)cks. jede Variable hat einen Namen, der (natürlich) ein Bezeichner ist, und
einen Datentypen, z. B. „Integer", „Real" txler auch ein selbsidefinierter Datentyp.
Zur Syntax:
variablendeklarationsteil = "VAR" { Variablendeklaration
I ] }
Variablendeklaration =
Namenaliste " : " Typ [ [ ]( "IMPORT" | "EXPORT" | "STATIC" ) ] |
Name ":" Typ "ABSOLUTE" Konstante
Namensliste = Name { "," Name }
Name = Bezeichner
Es gibt also mehrere Arten von Variablen:
* Die normalen Standardpascal-Variablen. Sie werden durch eine mit abgeschlossene
Bezeichnerliste und daliinterstehendem Typ deklariert.
Beispiel: a, b, abc: ARRAY [26..731] OF Char;
Der Compiler wird angewiesen, zur laulzeit beim Betreten des Blocks, in dem diese Variablen
deklarieit sind, auf dem Stack für tlie Variablen Platz einzurichten,
• Pseudo-Variablen, tlie an feste Speicheradressen gebunden sind. Hier besteht die Deklaration
aus einem einzelnen (!) Bezeichner, dem wie üblich ein Doppelpunkt und ein Datentyp folgen.
Dahinter stehen dann (ohne trennendes Semikolon!) die Directive ..Absolute“ und die
gewünschte Speicheradresse in Form einer ganzzuhligen Konstanten.
Beispiel: Hintergrund: integer ABSOLUTE $dffl80;
Solche Variablen sind vor allem bei der Programmierung der Hardware interessant; Im obigen
Beispiel entspricht die Variable „Hintergrund" dem Speicherwort an der Adres.se $dffl80 und
somit dem Register des Grafikchips, das die Hintergrundfarbc des Bildschirms enthält. Wenn
Sie dieser Variablen einen Wert zuw'eisen, ändert sich die Farbe entsprechend - einmal davon
abgesehen, daß das Betriebssystem Ihnen dazwischenpfuscht und in schneller Folge den alten
Wen wiederherstellt.
Es gibt zwei vortlefinierte ABSOLUTE-Variableii: „Mem" ist definien als „Meni: Array
|O...MaxLongInt] of Byte Absolute 0“, repräsentiert also den gesamten Hauptspeicher, und
„SysBase“ enthält durch ihre Deklaration als „Sysßase: Ptr Absolute 4“ einen Zeiger auf die
ExccBase-Struktur.
4. Syntax
93
Solche maschinennahen Programmierungen dürften die einzigen sinnvollen Anwendungen von
ABSOLLITE-Vaiiablen sein, denn ein anständiger Programmierer benutz.! niemals feste Adressen
- schon gar nicht auf dem .'\MIGA!
• Statische Variablen, die im Gegensatz, zu den normalen Variablen bereits beim Programmstart
eingerichtet werden. Sie belegen keinen Stack-Platz, sondern werden an anderer geeigneter
Stelle im Speicher abgelegt. Das macht sich bemerkbar, wenn eine statische Variable lokal in
einer rekursiven Prozedur oder Funktion dekhiriert werden. Bei einer Rekursion wird Rir sie
dann keine „neue“ Variable eingerichtet.
Variablen werden als statisch deklariert, indem man hinter ihre Deklarationszeile die Directive
„STATIC“ setzt.
Beispiel: VAR y, x: Real; STATIC;
a: STRING[20t; STATIC;
Im Ktipitel „Units und Module“ ist den statischen Variablen ein .\l\schnitt gewidmet.
• Modulüberschreitende importierte oder exportierte Variablen. Die.se Variablen sind immer auto-
mati.sch statisch. Näheres über diese Variablenart finden Sie im Kapitel ülier Module.
4.8 Prozeduren und Funktionen
P.VSC.AI. kennt zwei Arten von Unteiprogrammen: Procedures und Functions. Sie dienen jeweils
dazu, ein Programm in kleinere Einheiten zu gliedern und ,so überschaubarerzu machen. Außerdem
sjiart man sich Tipparbeit, wenn man einen öfter identisch oder ähnlich auftretenden Programmteil
als Pixjzedur deklariert. Es gibt aber auch viele andere Probleme, z. B. inhärent rekursive, die man
ohne Prozeduren und Funktionen kaum lösen könnte.
4.8.1 Allgemeines über Prozeduren
Eine Prozedur wird im Deklarationsteil eines Blocks deklariert. Sie wird mit dem Prozedurkopf ein¬
geleitet, der im einfachsten Fall aus dem Wortsymbol „PROCEDLIRE“ und dem Namen besteht und
mit einem Semikolon abge.schlossen werden sollte:
PROCEDURE Beispiel;
Danach folgt der Prozedurrumpf, ein Block. Eine Prozedur kann lokale Variablen, Konstanten,
Datentypen usw. haben. Es ist sogar möglich, Prozeduren und Funktionen beliebig tief ineinander
zu verschachteln (genaugenommen ist diese Schachtelimgstiefe in MaxonPASCAL auf die Tiefe 16
beschrankt, aber in der Praxis ward man wohl kaum über eine Tiefe von 3 otier 4 hinauskommen).
Eine Prozedur w'ird aufgerufen, indem man an der aufrufenden Stelle einfach ihren Namen .setzt.
MaxonPASCAL
94
Ein Beispiel:
PROGRAM ProzedurDemo;
VAR X, y: integer;
PROCEDURE PI;
VAR y: Real;
BEGIN
y:= 42;
wrlteln ('Prozedur PI', x:10, y:10);
END;
PROCEDURE P2;
VAR x: integer;
z: Char;
PROCEDURE Q; { lokale Prozedur von "P2" }
VAR y: Integer;
BEGIN
x:= 1;
y:= 2 ;
z:= '?';
writeln('Prozedur Q', xilO, y:10, z:10)
END; { Ende von "Q" )
BEGIN ( Anweisungsteil von Prozedur P2 }
x:= 26;
y:= 731;
z : = ' A' ;
wrlteln('Anfang P2', x:10, yslO, z:10);
Q;
wrlteln('P2 nach Q', x:10, y:10, z:10);
PI;
writeln('Ende P2 ', x:10, y:10, z;10)
END;
BEGIN { Hauptprograimn }
x:= 47;
y:= 11;
wrlteln ('Progreunmstart ', x:10, y:10);
PI;
writeln('Mitte Hauptprogramm', x:10, y:10);
P2;
wrlteln('Programmende
END.
x:10, y:10)
4. Syntax
95
Dieses Programm gibt folgendes aus;
Programmstart
Prozedur PI
Mitte Hauptprogramm
Anfang P2
Prozedur Q
P2 nach Q
Prozedur PI
Ende P2
Programmende
47
11
47
42
47
11
26
731
A
1
2
?
1
731
?
47
42
1
731
?
47
731
Wie funktioniert das Ganze? Wir haben ein Hauptprogramm mit zwei Prozeduren, von denen eine
Wiederrum eine lokale Prozedur enthält. Alle Prozeduren haben lokale Variablen. Man kann sieh das
so vorstellen:
Beispiel __
VAR x: integer
y: integer
PI
VAR y: Real
P2
VAR x: integer
z: Char
Q
VAR y: integer
Zunächst einmal fällt auf, dalS Variablen scheinbar doppelt deklariert werden und dxs auch noch mit
verschiedenen Datentyiien! Das hängt mit den folgenden Regeln über die Gültigkeitsbereiche von
Bezeichnern zusammen,
1. Das Hauptprogramm und alle Prozeduren haben jeweils eine eigene „Schachtel“ für ihre
Bezeichner. Da Prozeduren wieder selbst als lokale Prozeduren verschachtelt w'erden können,
gibt es eine Hierarchie von Schachteln: Ganz „oten“ ist die Schachtel des Hauptprogramms,
unter der die Schachteln, der im Hauptprogramm deklarierten Prozeduren stehen, unter wel¬
chen jeweils die darin lokal deklarierten Schachteln stehen uswc
MaxonPASCAL
96
2. ln jeder Schachtel sind die Bezeiciincr aus höheren Schachteln bekannt. Sic können aber inner¬
halb dieser Schachtel »iiberdefiniert“ werden. Eine obere Schachtel merkt grundsätzlich nichts
von den Bezeichnern der ihr untergeordneten Schachteln.
3. Ein Bezeichner ist „lokal“ zu der Schachtel, in der er deklariert wird und „global“ zu allen tiefer
liegenden Schachteln. In höheren Schachteln ist er nicht bekannt.
Nun können wir anfangen, das Beispielprogramni Schritt für Schritt durchzugehen. Zunächst wäre
da das Hauptprogramm mit den Variablen ,x“ und „y“, jeweils vom Typ „Integer“. Von den
Variablen, die in den Prozeduren deklariert werden, „weiß“ das Hatiptjirogramm nichts, so daß die
Variablen „x“ und „y“ zunächst ganz normal einen Wen erhalten und ausgegeben werden.
Jetzt W'ird aber die Prozedur „PI“ aufgerufen. Dort ist eine Variable „y“ definiert, und es wird die
interessante Wertzuweisung .,y:= 42“ au.sgeführt. Die lokale Definition hat Vorrang vor der gk.iba-
len, also bezieht sich diese Wertzuweisung auf die innerhalb ,.PT' tleklarierte Real-Variable. Die.se
Variable wirti dann auch ausgegeben, ebenso eine Variable „x“. Dazu gibt es im .Moment nur eine
Deklaration; die globale Integer-Variable des Hauptprogramms. Also wird deren Wert (47) ausgege¬
ben.
Nach Ende tles Anweisungsteils von „PI“ kehren wir in das Hauptprogramm zurück. Die Variablen
„x“ und „y“ haben noch die.selben Weite wie zuvor (47 und 11). ln „PI“ wurde zwar eine
Wertzuweisung an „y“ vorgenommen, diese bezieht sich aber auf die dortige lokale Variable, die mit
dem gleichnamigen globalen „f nichts zu tun hat.
Nun wird die Prozedur ,.P2“ ausgeführt. Dort werden als erstes Wertzuweisungen an „x“, „y und X
durchgefiihrt. Analog zum ersten Prozeduratifruf können Sie sich klarmachen, daß „,x“ und X loka¬
le Variabein sind, während ,.y“ sich hier auf den globalen Bezeichner bezieht. Es wird hier also in
einer Prozedur der Wert einer globalen Variablen geändert. So etwas nennt man einen
„Seiteneffekt“ dei' Prozedur (tilso eine auf den ersten Blick nicht erkennbare Auswirkung der
Prozedur auf den Gesamt-Programmablauf) und sollte möglichst vermieden werden - im nächsten
.4bschnitt erfahren Sie, wie man so etwas mit Hilfe von „Parametern“ sauber machen kann,
jedenfalls ward hier 26, 731 untl „A“ au.sgegeben, bevor ,.Q“ ausgeführt wird. Dort passiert nicht
mehr viel Neues: Eine lokale Variable „y“ wirti eingerichtet, und es gibt einen Seiteneffekt auf die
Variablen „x“ und „z“ der Prozedur „P2“. Nach Rückkehr aus „Q“ nach „P2“ haben diese Variablen
also plötzlich einen anderen Wert.
Nun geschieht etwas Interessantes: Die Prozedur „PI“ wird aus „P2“ heraus aufgerufen, Das ist mög¬
lich, tienn der Bezeichner „PI" ist ja global, d. h. in der Schachtel des Hauittprogramms, deklariert
und somit in der Schachtel von „P2“ bektmnt. Dort wird w'ieder die wohlbekannte Zuw'cisung an das
lokale „y“ durchgeführt und X ausgegeben. Welches „.x“ ist nun gemeint - das des
Hauptprogramms oder das der aufrufenden Prtizetlur „P2“? ln P.ASCAL gibt es den Begriff des ..stati¬
schen“ untl tles „dynamischen“ Vorgängers einer Prozetlur. Statischer Vorgänger von „PI“ ist immer
das Hauptprogramm, denn tlarin ist die Prozedur ja deklariert. Dynamischer Vtirgänger ist jew'eils
die aufrufentle Schachtel, ln diesem Fall, also beim zweiten Aufruf, ist die Prozetlur „P2“ tlyntimi-
scher Vorgänger. Die Itlentifikatitm von Bezeichnern w'irtl bereits vom Compiler vorgenommen,
4. Svntax
97
muß sich also auf den statischen Vorgänger Ireziehen, denn der dynamische steht ja erst zur laiuf/eit
der Prozeilur fest. Also bezieht X siclr hier wieder auf die Variable des Hauptprogramms und nicht
die des dynamischen Vorgängers „P2", so daß wieder 47 ausgegeben wird.
Da .,P1“ keine Seiteneffekte hat, haben sich nach Kückkehr von dort in die Schachtel von „P2‘' keine
Variablenwerte geändert. Nach dem Ende von „P2“ und tiem Riicksprung ins Hauptprogramm hat es
aber einen Seiteneffekt auf die globale Variable „y“ gegeben, so daß jetzt ein anderer Wert ausgege¬
ben wird,
ln der Praxis wird man natürlich keine so komplizierten Schachtelungen verwenden und nur in
Ausnahmefällen globale Bezeichner iiberdefinieren.
4.8.2 Parameter
Es wurde bereits erwähnt, daß man Seiteneffekte aus Gründen der Lesbarkeit des Listings vermei¬
den sollte. l.'m in der Deklaration der Prozedur deutlich zu machen, wovon der Prozedurverlauf
abhängt und welche globalen Grüßen er beeinflußt, gibt es die Parameter.
PASCAL kennt zwei .Arten von Parametern: Wertparameter („Call by value") und Variablenparameter
(„Call by reference“). Andere exoti.scbe Programmiersprachen kennen auch „Call by name‘" (z. B.
Siniula, .Macros in Assembler) oder „Call by value and return“ (z. B. Fortran), aber es ist gewiß kein
Verlust, daß uns jene Übergabearten in PASCAL erspan bleiben.
Der Witz hat zwar einen Bart, aber hier ist er trotzdem für alle, die ihn noch nicht kennen: PASCAL-
Erfinder Niklaus Wirth auf die Frage eines Amerikaners, wie man denn .seinen Namen aussprechen
solle: „You can call me by name, Wirth, or by value, Worth.“
4.8.2.1 Wert-Parameter
Das folgentle Programm enthält eine Prozedur, die tien größten gemeinsamen Teiler („ggT"") zweier
Zahlen nach dem Euklidischen .Algorithmus berechnet und ausgibt. Damit die Prozedur „weiß“, w^el-
che beiden Zahlen gemeint sind, werden diese als Parameter übergeben:
PROGRAM Euklid;
PROCEDURE ggT (a, b: integer);
VAR hilf: integer;
BEGIN
WHILE aoO DO
BEGIN
hilf:= abs (a);
a:= b MOD a;
b:= hilf;
END;
wrlteln(b)
END;
BEGIN
write ('Der ggT von 17 und 4 ist '); ggT (17, 4);
MaxonPASCAI,
98
write ('Der ggT von 12 und 16 ist '); ggT <12, 16);
write ('Der ggT von 42 und 4711 ist '); ggT (42, 4711);
END.
Man kann also in dem Prozedurkopf eine sog. Paramcterliste aufnehmen. In unserem Beispiel wer¬
den in der Prozedur zwei lokale Variablen „a“ und „b“ des Typs Integer eingerichtet. Beim Aufruf der
Prozedur ist dann anzugeben, mit welchen Werten diese Variablen vorbesetzt werden sollen: Beim
ersten Aufruf erhält „a“ den Wert 17 und „b" wird 4 zugewiesen usw. Diese Parameter verhalten sich
ansonsten wie ganz normale lokale Variablen der Prozedur, z. B. kann man ihnen - wie im Beispiel
geschehen - einen neuen Wert zuweisen usw.
Die „aktuellen Parameter“ (also die Werte, die man beim Prozeduraufruf angibt) können beliebig
komplexe Ausdrücke sein, sie müssen aber zu den „formalen Parametern“ (also dem, was in der
Prozedurdeklaration in der Parameteriiste steht) wertzuweisungskompatibel sein.
Wenn in der formalen Parameterliste mehrere unterschiedliche Parameter stehen sollen, sind diese
mit einem Semikolon zu trennen, z. B. so;
PROCEDORE Multipara (Zahl: Real; cl, c2: Char; Flag: Boolean);
Beim Aufruf müssen die aktuellen Parameter aber nichtsdestotrotz durch Komma getrennt werden,
etwa:
Multipara (x+2, 'A', chr(i+32), b);
ln der fomialen Parameterliste müssen Datentypen grundsätzlich in Form eines Typbezeichners
angegeben werden:
PROCEDDRE Pr(St: STRING[50));
wäre also FALSCH!
„STRl.NG“ allein ohne Längenangabe (d. h. mit Default 80) ist streng genommen kein
Typbezeichner. Es kann hier aber als solcher verwendet werden.
4.8.2.2 Variablenparameter
.Angenommen, wir wollen den ggT nicht ausgeben, sondern weiter mit ihm rechnen. Beispielswei.se
könnten wir ihn brauchen, um einen Bmch zu kürzen. Es gibt verschiedene Arten, wie eine
Prozedur einen Wert zurückgeben kann; Seiteneffekte auf globale Variablen (sollte man besser sein
lassen), Funktionen (siehe nächster Abschnitt) und V.AR-Parameter.
99
4. Syntax ___
In unserem ggT-Beispiel könnte das so aussehen:
PROCEDORE ggT (a, b: integer; VAR Ergebnis: integer);
VAR hilf: integer;
BEGIN
WHILE aoO DO
BEGIN
hilf:= abs (a);
a:= b MOD a;
b:= hilf;
END;
Ergebnis:= b;
END;
Der Variablen-Parameter wird also wie ein Wert-Parameter deklariert, nur dal.^ davor das
Schlüsselwort „VAR" gesetzt wird. In der aktuellen Parameterliste ist für den VAR-Parameter eine
dazu typkompatible Variable anzugeben, etwa so:
VAR n: integer;
ggT(42, 4711, n) ;
writelnt'Der ggT von 42 und 4711 ist n);
Beim Aufruf der Prozedur „ggT“ erhält der formale Parameter „Ergebnis“ eine „Referenz“ auf die
aktuelle Parameter-Variable „n“. Das bedeutet: eine Variable namens „Ergebnis“ gibt es überhaupt
nicht, sie ist nur ein anderer Name für den formalen Parameter. Wenn an „Ergebnis“ ein Wert zuge¬
wiesen wird, erhält in Wirklichkeit der aktuelle Parameter einen neuen Wert. Die beiden Variablen
sind für die Dauer der Prozedurabarbeitung identisch.
Ein anderes Beispiel: Eine Prozedur soll einen Bruch, der als Nenner und Zähler übergeben wird,
kürzen. Wir verwenden dazu wieder unsere „ggT“-Prozedur.
PROGRAM Bruch;
VAR nenn, zaeh: integer;
PROCEDURE ggT (a, b: integer; VAR Ergebnis: integer);
VAR hilf: integer;
BEGIN
WHILE aoO DO
BEGIN
hilf;= abs (a);
a:= b MOD a;
b:= hilf;
END; -v
Ergebnis:= b;
END;
PROCEDURE Kürzen (VAR Zähler, nenner: integer);
{ Die Parameter durch ihren ggT teilen. Wenn nenner=0,
Fehler melden. Bei zähler=0 den Nenner auf 1 setzen. }
MaxonPASCAL
100
VAR g: integer;
BEGIN
IF nenner=0 THEN
error ('Zähler ist Nulll')
ELSE
IF 2ähler=0 THEN
nenner:= 1
ELSE
BEGIN
ggT (Zähler, nenner, g);
nenner;= nenner DIV g;
Zähler:= Zähler DIV g
END
END;
BEGIN { Hauptprogramm}
write('Bruch eingeben: '); readln (zaeh, nenn);
Kürzen (zaeh, nenn);
writeln('ge)cürzt: ', zaeh, ' / nenn)
END.
Düs Programm tut das Gewünschte.
Wir haben es wirklich mit einem „Call by reference“ zu tun, nicht mit „Call by name". Beispiel:
PROGRAM Kleinlich;
VAR i: integer;
a: ARRAY [ 1..2 ] OF integer;
PHOCEDDRE Proc (VAR Para: integer);
BEGIN
i:= 2;
Fara:= 42
END;
BEGIN
a[i: := 1; a[2] := 2;
i:= 1;
Proc (a[i]);
writeln(a [1] : 5, a[2]: 5)
END.
Quizfrage: Was gibt dieses Programm aus?
Antwort: 42
Beim Aufruf erhält „Parä“ eine Referenz auf „a[i]“ - und das ist zu diesem Zeitpunkt „a|l]“. Deshalb
wird „42“ auch an „a[l)“ zugewiesen, obwohl inzwi,sehen „i" einen anderen Wert erhalten hat. Beim
sog.“Call by name“ würde einfach für „Para“ jeweils „a|i]“ einge.setzt, so daß dann „a|2j“ den Wert 42
erhalten würde.
4. Syntax
101
4.8.3 Funktionen
Funktionen sind Prozeduren, die einen Wert zurückgeben. Der Aufruf einer Funktion ist daher kein
Befehl, sondern Teil eines Ausdrucks.
Ihre Deklaration ist identisch mit der Prozedur-Deklaration, aber statt „PROCFd)lJRF;' ist das
Schlüsselwort „FUNCTION“ zu vei^cenden unti am Fnde des Kopfs ist der Typ des Rückgabewerts
anzugeben:
FUNCTION ggT (a, b: integer): integer;
VAR hilf: integer;
BEGIN
WHILE aoO DO
BEGIN
hilf:= abs (a);
a:= b MOD a;
b:=: hilf;
END;
ggT:= b;
END;
Irgendwo im Anweisungsteil der Funktion - oder einer untergeordneten lokalen Prozedur oder
Funktion - muls der Rückgabewert definiert werden, indem er dem Funktionsnamen zugewie.sen
wird.
Ein Aufruf dieser Function könnte so aussehen:
writelnt'Der ggT von 42 und 4711 ist: '# ggT(42,4711));
Oder SO:
nenner:= nenner DIV ggT<nenner, Zähler);
Der Rückgabetyp muK in Form eines Typbezeichners angegeben werden. Auch hier ist „STRING“ als
Pseudo-Bezeichner möglich.
Während Parameter grundsätzlich von jedem beliebigen Typ sein können, sind die Rückgabewerte
von Functions auf „skalare“ Typen beschränkt. Erlaubt sind:
- Numerische Datentypen (ganzzahlig und Gleitpunkt)
- CHAR, STR, Stringtypen
- BOOLEAN
- Aufzählungs- und Ausschnittstypen
Pointertypen
MaxonPASCAL
102
4.8.4 Prozedurparameter und andere Spezialitäten
MaxonPASCAL kennt keine Conformant Array Parameter. Dieses empfohlene Extra des ISO-
Standards ermöglicht es, Arrays mit variablem Indexbereich als Parameter zu übergeben. Man kann
sieb aber mit typfreien Zeigern behelfen (siehe Kapitel 5.6 Pointertypen).
Beispiel:
PROORAM CAP_ErBatz;
VAR i; integer;
a: ARRAY[1,.10] OF integer;
PROCEDURE SorttArrayzelger: Ptr; FeldAnzahl: integer);
VAR ap: ''ARRAY [0. .MaxInt] of integer;
i, j: integer;
BEGIN
ap:= Arrayzeiger;
{ Achtung, Array geht von 0 bis Feldanzahl-1 }
FOR i:= FeldAnzahl-2 DOWNTO 0 DO
FOR j:= 0 TO i DO
IF ap^ [ j ] > ap''[ j + 1 ] THEN
Exchange(ap*[ j ], ap*[ j+1 ])
END;
BEGIN
FOR 1:=1 TO 10 DO a[i]:= randomt1000);
Sort(*a, 10);
FOR i:=l TO 10 DO writeln{a[ i ]);
END.
Dieses Programm simuliert einen Conformant Array Parameter, indem ein Zeiger auf das Array
(MaxonPASCAL-Spezialität!) und die Anzahl der Elemente übergeben wird. Beachten Sie aber, daß
sich der Indexbereich ändert: a[l] entspricht ap ^ [Oj.
Man kann auch Prozeduren und Funktionen als Parameter übergeben. Formal sieht das so aus, daß
man in die formale Parameterliste einen Prozedur- cxler Funktionskopf schreibt, ln der aktuellen
Parameterliste ist dann nur noch der Name der Prozedur oder Funktion anzugeben.
Beispiel:
PROGRAM FuneParam;
PROCEDDRE ab(FDNCTION f(x:Real):Real);
VAR i:integer;
BEGIN
FOR i!=0 TO 10 DO
writoln(i/5:5!l, f(i/5):12:6);
writeln;
END;
BEGIN
writeln('Sinua:■);
Tab(Sin);
4 . Syntax
103
writelnt'Cosinus:'); Tab(Cos)
EHD.
Dieses Programm druckt Wenetabellen der Funktionen Sin und Cos. Ein weiteres Beispiel zu die¬
sem Thema finden Sie in den Beispielen unter dem Namen Jntegra.p“.
Bei rekursiven Problemen kommt es manchmal vor, daß zwei Prozeduren oder Funktionen sich
gegenseitig aufrufen müssen. Die einfachste läsung wäre, wenn man die Prozeduren ineinander
verschachtelt. Falls das aus irgendwelchen Gründen nicht möglich ist, kann man das Problem über
„FORWAIUT'-Referenzen lösen.
Dabei schreibt man von der ersten Prozedur oder Funktion zunächst nur den Kopf, gefolgt von
„FORWARD“, Nun „weiß“ der Compiler, dalä es diese Prozedur gibt und wie ihre Parameterliste aus-
sehen soll. Nun kann man die zweite Prozedttr und was auch immer schreiben, bevor man irgend¬
wann vor Ende des Deklarartionsteils den Block der ersten Prozedur „nachträgt“. Er wird eingeleitet
mit dem Kopf dieser Prozedur, aber ohne Parameterliste und (bei Funktionen) Ergebnistyp.
Das folgende Beispiel enthält zwei Funktionen, die auf besonders umständliche Weise feststellen,
üb eine Zahl gerade bzw. ungerade ist:
PROGRAM Forwarded;
VAR i: Integer;
FUNCTION Dng(n: integer): Boolean; FORWARD;
FUNCTION Ger(n: integer): Boolean;
BEGIN t "n" ist gerade, wenn n=0 gilt oder n-1 ungerade ist. )
IF n=0 THEN
Ger:= true
EDSE
Ger:= Ong(n-l)
END;
FUNCTION Dng;
BEGIN { Eine Zahl ist ungerade, wenn ihr Betrag nicht
gerade ist. )
üng:= NOT Ger(abs(n))
END;
BEGIN
write ('Bitte ganze Zahl eingeben: ');
readln <i);
IF ger(i) THEN
writeln('Gerade.')
ELSE
writelnt'Ungerade.')
END.
MaxonPASCy.
104
4.8.5 Zusammenfassend: Syntax
Hier ist die vollstänciigc Syntax für Prozedur- und Funktions-Dekiarationen:
Prozedur/Funktionedeklaration
= ProzFunkKopf (("FORWARD" | "IMPORT" |
"EXTERNAL") ";" | ["EXPORT" ">"] Block)
ProzFunkKopf = {"PROCEDLtRE" Bezeichner ( Formale
Parameterliste ] [ ";" ]) | ("FUNCTION"
Bezeichner [ FormaleParameterliste ]
[ Typbezeichner ] [ ";" J)
FormaleParameterliste
= "(" Formalerparameter [ Formaler
Parameter ) ")"
FormalerParameter
= ([ "VAR" ] Bezeichner {
TypBezeichner) | ProzFuntcKopf
Bezeichner }
Zu „i.MPORT“, „EXPORT“ und „EX'i'ERNAL“ finden Sie im Linker-Kapitel nähere Erläuterungen.
4.9 Anweisungsteil
Der Anweisungsteil eines Blocks besteht aus einer mit BEG1N...END geklammerten Folge von
Befehlen. Er ist der einzige Teil, der in einem Block nie fehlen darf.
Syntax:
Anweisungsteil = "BEGIN" Anweisung { [ ] Anweisung ) "END"
Es gibt viele verschiedene .Arten von Anweisungen, was auch in unserer EBNF-Syntax zum Ausdruck
kommt:
Anweisung = [ Marke ":" ] [ Wertzuweisung | Prozeduraufruf |
Verbundanweisung | Fallunterscheidung | REPEAT-Schleife (
WHILE-Schleife 1 FOR-Schleife I CASE-Anweisung |
WITH-Anweisung | GOTO-Sprung ]
Vor jeder Anweisung kann also eine Sprungmarke stehen, und eine Anw'eisung kann grundsätzlich
auch leer sein.
4. Syntax
105
4.9.1 Wertzuweisung
Syntax; variable “ Ausdruck
Der Ausdruck muß zur Variablen werczuweisungskompatibel sein. Dabei gelten folgende Regeln;
Variable _
Ganzzahlig
Real, Double
Char
Boolean
Aufzählungstyp
Pointer
Referenztyp
Str
SET
STRING[n]
ARRAY
Elementtyp
RECORD
Ausdruck _
beliebiger Ganzzahltyp, auch andere „Breite“
numerisch
Char-Konstante, -Variable, -Funktion
Boolean
Ausdruck desselben Aufzählungstypen
typfreier Zeiger, „NIL“ oder Zeiger mit typkompatiblem
Char- oder Str-Ausdruck, STRING-Variable, String-Konstante,
keine String-Ausdrücke!
beliebiger Mengenausdruck
Char- oder Stringausdruck
Array-Variable mit gleichem Indextyp und typkompatiblem
gleicher Recordtyp, oder strukturgleicher Record mit jeweils
typkompatiblen Feldern
In der Tabelle taucht des öfteren der Begriff der „Typkompatibilität" auf. Diese Kompatibilität ist
strenger definiert als der Begriff der Wenzuweisungskompatibilität; hier müssen skalare Typen
zusätzlich die gleiche „Breite“ haben. Falls Sie in der Übersicht die Ausschnittstypen vermißt haben;
Sie werden mit ihren jeweiligen Grundtypen identifiziert. Ein Datentyp wie „1..10000“ wäre also
sowohl wertz.uweisungs- als auch typkompatibel zu „Integer“.
4.9.2 Prozeduraufruf
Es gibt vordefinierte Standardprozeduren (siehe Kapitel 7) und selbstdefinierte Prozeduren, wie im
W Airschnitt 8 dieses Kapitels dargestellt wurde. Beim Aufruf sind diese beiden Prozedunypen völlig
gleichgestellt:
Prozeduraufruf = ProzedurBezeichner [ Pareuneterliete |
Write-Parameterliste e ]
Paranieterliste= "(" Ausdruck { Ausdruck } ")"
,4bgesehen von „Write“ und „Writel.n“ sehen Parameterlisten also stets gleich aus. Allerdings ist es
bei vordefinierten Prozeduren oft so, daß der genaue Inhalt von Parameterlisten, z. B. Anzahl oder
Datentyp der Parameter, nicht fest ist.
.'Vlies über vordefinierte Prozeduren finden Sie im Kapitel 7.
MaxonPASCAL
106
4.9.3 Verbundanweisung
Man kann mehrere Anweisungen zu einer einzigen zusammenfassen, indem man sie mit „BEGIN“...
,,END“ klammert:
Verbundanwelsung = "BEGIN” Anweisung { [ ] Anweisung ) "END"
Vor dem „END" muß also kein Semikolon stehen. Man darf es natürlich setzen, was iasofem in der
Syntax enthalten ist, da man sich als letzte Anweisung eine Leeranweisung denkt.
Verbundanweisungen werden bei den im folgenden beschriebenen strukturierten Anweisungen
benötigt, da an einigen Stellen formal keine Anw'eisungsfolge, sondern eine einzelne Anweisung Ste¬
hen muß.
4.9.4 Fallunterscheidung
Die wicbdgste Art der Falluntersclieitlung ist die „IF“-Anweisung. Ihre Syntax ist wie folgt:
"IF" Ausdruck "THEN“ Anweisung [ "ELSE" Anweisung ]
Als Bedingung ist ein beliebiger Ausdruck des Typs „Boolean" erlaubt. Insbesondere kann hier eine
einzelne Varialrle dieses Typs gesetzt werden. Ich weise darauf extra hin, da es ein „beliebtet' Stil-
Fehler ist,
IF b = true THEN ...
ZU schreiben (wobei „b“ eine boolesche Variable ist). Hier reicht ganz einfach:
IF b THEN_
Ist der Ausdruck „wahr", wird die Anweisung hinter dem „THEN“ au.sgeführt (mit Hilfe einer
Verbundanweisung kann man hier natürlich auch eine beliebig lange Anweisungsfolge setzen). Ist
die Bedingung nicht wahr, so wird ■ falls vorhanden - die Anweisung des „ELSE'‘-Tdls ausgefuhrt.
Es gibt eine kleine „Zweideutigkeit“ in diesem Zusammenhang:
IF bl THEN
IF b2 THEN sl
ELSE s2;
Diese Zeile ist - syntaktisch betrachtet - nicht eindeutig: Das „ELSE" könnte theoretisch zu beiden
„IF“ gehören. Man hat hier definiert, daß es zum letzten „IF" gehört. Die ohige Anweisung ent¬
spricht also
IF bl THEN
BEGIN
IF b2 THEN Bl
ELSE s2
END;
4. Syntax _
Um das „ELSE" ausdrücklich an das erste JP' zu bintlen, könnten Sie folgendes schreiben:
107
IF bl THEN
BEGIN
IF b2 THEN sl
END
ELSE
s2;
4.9.5 REPEAT-Schleife
Syntax:
"REPEAT" Anweisung { ";" Anweisung } “UNTIL" Ausdruck
Der Schleifeninhalt wird ausgefühn, bis die Bedingung (beliebiger Boolean-Ausdruck) hinter dem
„UNTIL“ wahr ist. Da die Bedingung am Schleifenende geprüft wird, wird die Schleife mindestens
einmal durchlaufen.
4.9.6 WHILE-Schleife
Syntax:
"VraiLE" Ausdruck "DO" Anweisung
Die Schleife wird durchlaufen, solange die Bedingung erfüllt ist. .
Unterschiede zu „REPEAT":
• Die Bedingung (Boolean-Ausdruck) wird hier am Schleifenanfang geprüft. Dadurch wird die
Schleife überhaupt nicht durchlaufen, wenn die Bedingung schon vor dem ersten Durchlauf
„false“ ist.
• Die Schleife bricht ab, sobald die Bedingung NICHT erfüllt ist (die REPEAT-Schleife wird durch¬
laufen, bis die,\bbruchbedingung erfüllt ist).
• Der Schleifenkörper der WHIi.E-Schleife besteht formal nur aus einer einzigen Anweisung, ln
Form einer Verbundanweisung (mit „BEGIN“ und „END“ eingeklammert) kann man aber auch
hier eine beliebig lange Anweisungsfolge benutzen.
4.9.7 FOR-Schleife
Syntax:
"FOR" Variable ":=" Startwert ("TO" I "DOWNTO") Endwert "DO" Anweisung
Die Variable wird auf den Startwert gesetzt und dann nach jedem Schleifendurchlauf auf den
nächsthöheren (bzw. nächsttieferen, falls „DOWfO“ verwendet wird) Wert gesetzt, bis der
Endwert überschritten (bzw. unterschritten) wird.
MilxonPASCAL
108
ALs Schleifcnzählvariable ist jede Variable eines geordneten Typs erlaubt, da.s sind:
- Ganzzahltypen (NICHT Real!)
- Char
Boolean
Aufzählungstypen
- Ausschnittstypen aus diesen genannten Typen.
Irn Gegensatz zu einigen anderen PASC.AL-Implementierungen mul:! die Variable nicht lokal sein.
Start- und Endwert sind beliebig komplizierte Ausdrücke, die zur Zählvariablen zuweisungskompati¬
bel sein müssen.
Bitte denken Sie daran, dali hinter dem „DO“ kein Semikolon stehen darf, es sei denn, Sie wollen
ausdrücklich eine leere Schleife programmieren.
Der Rumpf der FOR-Schleife ward keinmal ausgeführt, wenn der Stanweri größer (bei „TO“) bzw.
kleiner (bei „DOWNTO“) als der Endw'ert ist.
Innerhalb der Schleife darf der Wert der Schleifenvariablen nicht verändert werden. Dies wird vom
Compiler aber nicht überprüft! MaxonPASCAl, berechnet vor dem ersten Schleifendurchlauf, wie oft
die Schleife auszuführen und die Zählvariable weiterzuzählen ist.
Die Schleife
FOR v:= el TO e2 DO s;
entspricht in etwa:
v:a el;
count:= ord(e2) - ord(v);
WHILE count >= 0 DO
BEGIN
S/ { Schleifenrumpf ausführen >
v:= succ (v); { Zählvariable weitersetzen }
count:= count - 1 { internen Zähler erniedrigen }
END;
4.9.8 CASE-Anweisung
Syntax:
"CASE" Ausdruck ”OF"
{ Konstantenliste ":" Anweisung )
[ ("OTHERWISE" I "ELSE") [ Anweisung { Anweisung } ] ]
"END"
Konstantenliste = Konstante [ Konstante ] { Konstante I
Konstante ] }
4. Svntax
109
Die CASE-Anweisung ist eine MeliitKli-Fallunlersclieidung, bei der aufgrund des Vergleichs eines
geordneten Ausdrucks (also Ganzzahlig, Boolean, Char, Aufzählungstyp) mit Konstanten verzweigt
wird.
Wie Sie schon aus der Syntax erkennen können, gibt es hier zwei Ergänzungen zum ISO-Standard:
• Es können Bereiche von Konstanten angegeben werden.
Gase i Of
-MaxInt..O, 20..MaxInt:
writelnt'Eingabe nicht im erlaubten Bereich.');
1.. 8: writelnt'Zu kleinl');
12 .. 19:writelnt'Zu groß!');
9, 11: writelnt'Fast richtig.
10: writelnt'Richtig.')
End;
' ) ;
Dieses CASE-Statement gibt zu jeder Integerzahl „i“ einen Kommentar aus.
Es gibt einen optionalen ELSE-Zweig, tler wahlweise mit .,ELSE“ oder „OTHERWISE“ eingeleitet
wird. Dieser Teil kann beliebig viele .Anweisungen enthalten.
Beispiel:
Case c
Of
'A' ,
*a' :
writelnt'Ah');
’B' ,
’b' :
writelnt'Bee');
’C ,
' c' :
writelnt'Zeh');
' D* ,
■d* :
writelnt'Dee');
•O’ .
. '9' :
Begin
writelnt ' Bitte )ceine Zahlen!');
writelnt' tich ]cann nämlich nicht zählen
End;
' e' .
. ' Z ' !
writelnt'Irgend so'n Kleinbuchstabe.');
•E'..'Z':
Else
writeln;
writelnt'Das war ein GROSSER Buchstabe.');
writelnt
End;
'Tut mir leid, diesen Buchstaben Icenne ich nicht.');
Wie bereits erwähnt, hätte man statt ELSE auch OTHERWISE schreiben können. Ferner sehen Sie,
claR vor E1.SE (im Gegensatz zu IF-TlIEN-ElJsE) ruhig ein Semikolon stellen darf.
Hat die CASE-Anweisung keinen ELSE-Zweig und der Ausdruck einen Wert, der in den
Konstantenlisten nicht auftaucht, so wird ein Laufeeitfehler gemeldet. Es ist nicht erlaubt, einen
Wert mehrfach in den Konstantenlisten aufzuführen. MaxonPASC.Al. meldet dabei aber keinen
Fehler, .sondern führt, wenn der .Ausdruck einen doppelt vorgesehenen Wert hat, nur die erste
.Anweisung aus!
MaxonPASCAL
110
4 . 5.9 WITH-Anweisung
Syntax:
"WITH" Variable ( Variable ) "DO" Anweisung
Die Variable muß von einem RECORD-Typ sein. Innerhalb der VtITH- Anweisung kann man dann
jedes Feld dieses Records direkt wie eine Variable ansprechen.
Beispiel:
TYPE Person = RECORD
Name: RECORD
Vor, Nach: STRING [40]
END;
Piz; integer;
Ort: STRING [50]
END;
VAR PI, P2: Person;
WITH PI DO
BEGIN
Naine.Vor:= 'Dietrich';
Name.Nach:s 'Gerstenberger';
Plz:=. 4799;
Ort:= 'Horchen'
END;
Die Anweisung ließe sich, da „Name" innerhalb der '»ITH-Anweisung ja eine eigenständige Variable
ist, so weiter vereinfachen:
WITH PI DO
WITH Name DO
BEGIN
Vor:= 'Helmut';
Nach!= 'Kohl';
Plz!= 5300; I
Ort:= 'Bonn'
END;
Dafür gibt es eine Abkürzupg: Man faßt einfach die beiden WITH’s zusammen:
WITH PI, Name DO
BEGIN ...
END;
Es ist aber nicht zwingend, daß die zweite Variable Bestandteil der ersten ist, es können auch von¬
einander unabhängige Variablen sein.
Beispiel:
WITH PI, P2.Name DO
BEGIN
Nach:= Name.Nach;
P2.Plz:= Piz;
P2.0rt:= Ort
END;
Was geschieht hier? Durch „WITH PI“ werden die Variablen „Name“, „Piz“ und „Ort“ eingerichtet,
die sich auf Bestandteile von ,,P1“ beziehen, während „WITH P2.Name , die zu „P2 gehörigen
Variablen „Vor“ und „Nach“ erzeugt. .Mso erhält in unserem Beispiel „P2" Nachname, Ort und
Postleitzahl von „PI“.
4.9.10 GOTO-Sprünge
Syntax:
"GOTO" Label
Ein Inbel kann (siehe Kapitel 4.4 „Label“) entweder eine Ziffernfolge oder ein Bezeichner sein.
Gemäß ISO-Standard kann man aus Strukturen mit „Goto“ herausspringen (z. B. aus Schleifen her¬
aus oder aus Unterprogrammen ins Hauptprogramm), aber nicht umgekehrt.
MtixonPASCAl, macht sich aber nicht die Mühe, dies alles genau zu prüfen. So ist es z. B. möglich, in
eine WHILE- oder REPEAT-Schleife hineinzuspringen.
Lediglich Einsprünge in FOR-Schleifen und 'XITH-Anweisungen werden abgefangen (und natürlich
der Sprung in ein Unterprogramm - schon allein dadurch, daß ein dort gesetztes Label ja lokal dekla¬
riert sein muß).
Allgemein anerkannte Konvention über Goto:
Sprünge sollten nur da eingesetzt werden, wo der normale Programmablauf abgebrochen
wird (z. B. wegen eines Eingabefehlers) oder wo das Programm ohne GOTO unnötigerweise
übermäßig aufgebläht würde. Man sollte aber bei jedem GOTO einen Kommentar setzen, aus
dem hervorgeht, warum und wohin hier gesprungen wird und bei jedem Label vermerken, von
wo und unter welchen Bedingungen hierher gesprungen wurde.
5. Datenn'pen
113
5. Die Datentypen von MaxonPASCAL _
5.1 Numerische Typen
M;)xonPASC.\L bietet nicht wcnij>er als 7 vcrsctiieciene ntimerische Datentypen:
Integer
Der gewohnte Ganzzahlbcreicli -(Maxim -f 1).H-Maxlnt, Mtixlnt=32767
Longlnt bzw. Long
32-Bit-Ganzzahltyp mit Vorzeichen, Bereich -(Maxlxinglni + l) bis -i-MaxIxtnglnt. Die Konstanten
„MaxLonglnf und „MaxLong“ haben den Wert 2147483647.
Shortint bzw. Short
Vorzeichenbchafteter 8-Bit-l ntegertyp, MaxShonInt=M;ixShort=127.
Cardinal bzw. Word
Dieser Ganzzahltyp ist vorzeiclienlos, umfaJst also nur positive Werte und zwar im Bereich von (1 bis
MaxCard = MaxWord=65535.
ShortCard bzw. Byte
Vorzeichenlose 8-Bit-Zahl, Wenehereich von 0 bis .MaxShortCard =MaxB\'te=255.
Real
32-Bit-Realzahlen: 24 Bit Mantisse, l Bit Vorzeichen, 7 Bit Exponent. Das reicht für ca. 7-stellige
Rechengenauigkeit im Bereich bis etwas über 8*10'' 18. Nicht gerade viel, aber für die meisten
Zwecke genug.
LongReal bzw. Double
Seit Version 2.0 gibt es jetzt auch FlicRpunktzahlen doppelter Genauigkeit nach lEEE-Norm. Sie
sind 64 Bits breit (1 Bit Vorzeichen, 11 Bit Mantisse, 52 Bit+1 Hidden-Bit Mantisse), belegen im
Speicher also 8 Bytes. Die Rechengenauigkeit ist etw'a 15-.slellig, der Exponentenbereich ist 1E+-
308, das sollte genügen.
5.1.1 Ganzzahl-Typen
Fünf der genannten Zahlentypen, nämlich Integer, Shortint, Longlnt, Cardinal und ShortCard, sind
sogenannte Ganzzahltypen, tl. h. sie umfas.sen nur ganz/aihlige Werte. .Alle diese Typen können
beliebig durcheinander verwendet werden, ohne daß man Typwandlungen vornehmen muß. Der
Haken: MaxonPASCAL muß trotzdem dafür sorgen, daß verschiedene zusammen benutzte
Datentypen aneinander angepaßt werden.
Diese Transformationen kosten teilweise nicht unerheblich viel Laufzeit, so daß es in der Regel bes¬
ser ist, in Ausdrücken nur Daten gleichen Typs zu benutzen.
MaxonPASCAl,
114
MaxonPASCAL wählt bei Kombination von unterschiedlichen Datenrypen stets einen höheren, der
beide umfaßt, z. B. w'ird die Summe eines Integer- und eines Cardinalwerts im I.onglnt-Bereich
berechnet.
Ausschnittstypen sind stets Integer- oder Longlnt-Typen, auch wenn sie theoretisch in einem „klei¬
neren“ Typ Platz hätten. Beispiel:
Type
Hundert = 1..100; {belegt 16 Bit, d.h. ist Ausschnitt von Integer}
NochMehr = 0. .50000 { ist ein Longlnt-Typ, obwohl auch Cardinal
möglich wäre. }
Es können auch Hexzahlen (Beispiel: $686b, $00C00276, $0d, $Bad) und Binärzahlen (Beispiel:
%110, %101010101, %00ir) verwendet werden.
Bei allen Ganzzahltypen gibt es folgende arithmetische Operatoren:
+ Addition
Subtraktion oder auch Vorzeichen
* Multiplikation
DiV Ganzzahlanteii der Division
MOD Divisionsrest
Natürlich gilt „Punktrechnung vor Strichrechnung“, so daß Multiplikation und Division Vorrang vor
Addition und Subtraktion haben.
Gerechnet wird aber nur in den Wertebereichen Integer, Cardinal und Longlnt. Wenn zwei Shortlnt-
t)der ShortCard-Werte verknüpft werden, werden sie automatisch nach Integer oder Cardinal
gewandelt.
Die beiden Divisionsoperatoren funktionieren nicht ganz korrekt, wenn einer der Operanden nega¬
tiv ist: In der Mathemadk ist es üblich, daß „a MOD b“ stets ein Ergebnis zwischen 0 und dem Betrag
von b-1 liefert und daß bei „a DIV b“ immer das Ergebnis der normalen Division abgerundet wird.
Die Divisionsbefehle des Mikroprozessors MCößOxO, der in Ihrem AMIGA steckt, arbeiten aber
anders: Hier wird erst mit den Beträgen der Operanden gerechnet, und anschließend wird das
Vorzeichen des Ergebnisses negativ gewählt, wenn genau einer der Operanden negativ war. Aus
Geschwindigkeit.sgründen muß auch MaxonPASCAl. diese eigentlich falschen Operationen benut¬
zen.
5. Datentypen
115
Die folgende Tabelle soll diesen Sachverhalt verdeutlichen:
Mathematisch MC 680x0
42
DIVIO
4
(-42)
DIVIO
-5
42
DIV (-10)
-5
(-42)
DIV (-10)
4
42
MOD 10
2
(-42)
MOD 10
8
42
MOD (-10)
8
(-42)
MOD (-10)
2
4
-4
-4
4
2
-2
-2
2
So tragisch, wie es zunächst scheint, ist das Ganze aber nicht, denn in der Praxis ist der linke
Operand selten und der rechte fast nie negativ, AulSerdem ist sowohl bei der mathematisch übli¬
chen als auch der von Motorola (dem 680x0-Hersteller) vorgenommenen Definition gewährleistet,
daß stets folgende Gleichung gilt:
a = b*<a DIV b) + (a MOD b)
Bei arithmetischen Operatoren kann es natürlich zu Überläufen kommen, wenn das Ergebnis einer
Rechnung nicht im gewühlten Rechenbereich liegt. Es kommt nur dann zu einer Fehlermeldung,
w'enn die entsprechende Compiler-Option mit „{$opt a-f}“, dem Pull-Down-Menü
„Optionen/Compiler" oder dem „Preferences‘'-Tastaturmenü eingeschaltet wurde, andernfalls ist das
Ergebnis Undefiniert. Genaueres Uber diese Option erfahren Sie im Kapitel 8, Abschnitt 1.5:
„Compiler-Optionen".
Im .Abschnitt „Typkonvertierungen" dieses Kapitels finden Sie Tips, wie Sie in bestimmten Fällen
iJberläufe vermeiden können.
Neben den erw'ähnten arithmeti.schen gibt es noch die logischen Operatoren AND, OR, XOR, NOT,
SHL und SHR, die Zahlen bitweise verknüpfen:
AND, OR und XOR funktionieren im Prinzip genau wie die gleichnamigen Boolean-Operatoren, nur
daß hier jeweils die Bits der Operanden zu den entsprechenden Bits des Ergebnisses verknüpft wer¬
den.
Hier sind einige Beispiele - mit Binärzathlen, da es hier ja auf die Bits ankommt:
AND
%11111100
%10111010
=
%10111000
%1100
OR
%10001010
Ein Bit wird gesetzt, wenn
beide Bits der Operanden
gesetzt sind.
Ein Bit wird gesetzt, wenn
mindestens eins der Operandenbits
gesetzt ist.
%10001110
MaxonPASCAL
116
%11001100 Ein Bit wird gesetzt, wenn die
XOR %11111010 beiden Operandenbits verschieden
-- sind, also genau eins gesetzt
= %00110110 ist.
NOT fühn auf ganzen Zahlen eine logLsdie Negation aus, d. h. alle Bits des folgenden Operanden
wertlen invertiert.
Beispiele:
NOT 0 = -1
NOT %110 = = -7
NOT 26730 = -26731
Genau wie bei booleschen Ausdrücken hat NOT auch hier höchste Priorität, so dalä
NOT a*b äquivalent zu
(NOT a) * b ist.
Außerdem gibt es noch die Operatoren .SML und SHR, „Shift left“ und „Shift right“. Sie verschieben
die Bits des linken Operanden um so viele Positionen nach links bzw. rechts, wie der zweite
0[)erand angibt. Das entspricht einer Multiplikation mit bzw. einer Division durch eine
Zweierpotenz.
Beispiele:
1 Shl 6 =64 (= 1 * 2''6)
10 Shr 1 =5 (=10 div 2*1)
MaxInt Shr 14 = 1 (= (2*15-1) div (2*14))
Beide Operanden müssen ganzzahlig sein. Der rechte Operand darf nicht negativ sein, andernfalls
ist das Ergebnis Undefiniert (wenn es sich um eine negative Konstante handelt, z. B. „17 shl -2“, mel¬
det bereits der Compiler einen Fehler). Es findet kein Test auf Überlauf statt, auch nicht, wenn die
Compiler-Option „Arithm. Überl. “ aktiv ist.
Die Shift-Operanden zählen zu den Multiplikation.soperanden, sie haben also dieselbe Priorität wie
„DIV“ oder „MOD“.
Beispiel:
NOT 1 shl 5 + 2 entspricht ((not l) shl 5) + 2
Hier ist noch einmal eine Übersicht über alle Ganzzahl-Operatoren und ihre
Auswcnungsreihenfolge. Es werden immer zuerst die Operatoren in den oberen und dann die in
den unteren Zeilen der Tabelle zusammengefaßt. Operatoren, die in der selben Zeile stehen, wer¬
den von links nach rechts ausgew'ertet.
5. Datentypen
117
Arithmetisch Logisch
Invertierung;
Multiplikativ:
Vorzeichen:
Additiv:
Vergleiche:
NOT
*, DIV, MOD AND, SHL, SHR
+, "
+, - OR, XOR
<, >, <=, >=, =, <>
Bd der Ausgabe mil „WWe" werden Inieger-Zahlen linksbündig ausgegeben (Aliweichung vom
Standard!).
Write(17/ 4, 17+4);
erzeugt also die Ausgabe
17421
Sie erhalten eine rechtsbündige Ausgabe, indem Sie hinter der Zahl die gewünschte Feldbreite als
Ganzzahl-Ausdruck angeben:
Writetl7:5, 4:5/ 17+4:10)
gibt aus:
17 4 21
Bei der Eingabe mittels „Read" werden nur dezimale Zahlen akzeirtiert. Im Falle einer unerlaubten
Eingabe wird aber kein laufeeitfehler gemeldet.
5.1.2 Gleitpunktzahlen
Ma.xonPASCAL benutzt die normalen Gleitpunkt-Bibliotheken, die das Betriebssystem zur Verfügung
stellt. Insliesondere stehen zw'ei verschiedene Zahlenformate zur Verfügung: Die einfach genauen
„Real“-Zahlen und ein doppelt genaues Format, das „LongReal“ oder „Double“ heißt.
Eine Real-Zahl ist 32 Bit „breit“ und belegt also 4 Btles im Speicher, während Double 64 Bit=8 Byte
breit ist. Rechnungen mit doppelter Genauigkeit sind erheblich langsamer als normale Real-
Rechnungen, allerdings unterstützt die Mathebibliothek doppelter Genauigkeit eine evtl, vorhande¬
ne FPLI (Fließkomma-Coprozessor).
Es ist erlaubt, in Ausdrücken beide Zahlenformate zu kombinieren oder auch Gleitpunktzahlen mit
Gan/yahlau.sdrücken zu verknüpfen. Auch hier gilt, daß Typumwandlungen nicht unerheblich
Reebenzeit benötigen.
MaxonPASCAL
118
Auf beiden Zahlentypen gibt es folgende Operatoren:
Multiplikation
/ Division
+ Addition
Subtraktion oder Vorzeichen
Natürlich gilt auch hier „Punkt- vor Strichrechnung". Ferner gibt es die üblichen Vergleichs-
ojxirationen, die einen Boolean-Wert liefern:
=, <>, <, >=, >, <=
Ein Problem der meisten Programmiersprachen ist die „Überladung" von Operatoren: „+“ und
sowie die Benutzung der Vergleichsoperatoren sowohl für Ganzzahl- als auch für
Realoperationen. Dabei gelten folgende Regeln:
• Wenn einer der beiden Operanden von einen Fließkommatyp ist, wird auch im
Fließkommabereich gerechnet.
• Bei einer Verknüpfung eines Real- und eines Double-Operanden wird das Ergebnis im Double-
Bereich berechnet.
Der Divisionsoperatorliefert stets eine Fließkommazahl als Ergebnis, bei „DIV" und „MOD" sind
nur ganze Zahlen als Operanden erlaubt.
Die beiden Fließkommatypen sind auch wertzuweisungskompatibel. Wenn man aber einen Real-
Wert an eine Double-Variable zuweist, kann man Ülreraschungen erleben:
Var r: Real;
d: Double;
Begin
r:= 0.2;
d:= r;
writelntr, d)
End.
Ergebnis: 0.2 0.1999999880079071
Die Double-Variable hat also scheinbar einen ungenauen Wen. Wie ist das möglich, da Double
doch, Gerüchten zufolge, genauer ist als Real? Nun, eine Zahl wie 0.2 ist binär nicht mit endlich vie¬
len Stellen darstellbar (im Dezimalsystem kann man 1/3 ja auch nicht als endlichen Dezimalbruch
darstellen). Wenn diese Zahl nun an die Real-Variable zugewiesen werden soll, erhält die Variable in
Wirklichkeit den besten darstellbaren Näherungswert für 0.2 - und das ist in dezimaler Darstellung
etwa 0.1999999880079071, Sie sehen hier die etwa 7stellige Genauigkeit. Wenn diese Realzalil nun
ausgegeben wird, berücksichtigt die Ausgaberoutine des MaxonPASCAl.-Lauf 2 eitsystems die geringe
Rcchengenauigkeit und rundet auf 6 oder 7 Dezimalstellen, je nach gewünschtem Ausgabeformat.
Also wird 0.2 ausgegeben, und der Anwender wird mit diesem kleinen Trick über die geringe
Rechengenauigkeit hinweggetäuscht.
3. Datentypen
119
Durch „d:= r‘ bekommt aber die Double-Variable „d“ den ungenauen Näherungswen zugewiesen -
und bei der nachfolgenden Ausgabe wird dann nicht auf 6, sondern auf 15 Dezimalstellen gerundet.
So führt die höhere Genauigkeit zu einem scheinbar ungenaueren Ergebnis.
Bei der Ausgate mittels „Wtite" gibt es mehrere Optionen:
ra’ write(x) oder write(x:b) oder write(x:b:0)
Im Bereich lOÜOO < x <= 0.1 wird die Zahl x „normal“ ausgegeben, andernfalls in
Exponentialdarstellung. ln beiden Fällen werden überflüssige Nullen am Ende weggelassen.
„b“ gibt hier wie immer die Breite des Feldes an, in das die Zahl rechtsbündig ausgegeben wer-
tlen Süll.
Bei negativen Zahlen beginnt die Ausgabe mit dem Minuszeichen, bei positiven Werten wird am
Atifang ein Leerzeichen ausgegeben. Beispiele:
write(-4/2) "2
write(pi) 3.14159265358979
write(26.7316+9:20) 2.6731E+10
ins" write(x:b:n) mit n > 0
Die Zahl x wird in Festkomtnadarstellung mit n Nachkommastellen ausgegeten. Beispiele:
write(17.4:12:3) 17.400
write(26.731: 12: 2) 26.73
„rite(pi:25:25) 3.1415926535897930000000000
Bei „Real“ sind bis zu 20 Stellen möglich. Beachten Sie aber, da(^ der AMIGA hier nur mit etwa 6
1/2 - stelliger Genauigkeit rechnet, so daß es schon an der 7. Stelle (Vorkommastellen mitge¬
rechnet) zu Rundungstehlern kommen kann und der ganze Rest nur mit Nullen aufgefüllt wird.
Im „Double“-Bereich sind bis zu 25 Nachkommastellen möglich, aber auch hier werden maximal
16 „echte“ Stellen ausgegeben, der Rest ist Null.
tä" write(x:b:n) mit n < 0
Die Zahl x wird in FAponentialdarstellung und in „-n“ - stelliger Genauigkeit ausgegeben.
Beispiele:
write(26.731:12:-4) 2.673E+01
write(0.07:12:-5) 7.0000E-02
write(0:12: -3) O.OOE+00
Die ganzen mathematischen Funktionen, wie „SIN", „liXF", „SQRT oder „LN", sind nur im Real-
Bereich definiert. Sie können zwar wegen der beidseitigen Wertzuweisungskompatibilität auch auf
Zahlen doppelter Genauigkeit angewandt werden, liefern dann aber ungenaue Ergebnisse, nämüch
in der siebenstelligen Real-Genauigkeit! In der „mathieeedoubtrans.library“ finden Sie alle nötigen
Funktionen in doppelter Rechetigenauigkeit.
MaxonPASCAI,
120
5.2 Boolean
Der Datentyp „Boolean“ umfafSt die beiden Werte „True“ und „False“. Sie sind geordnet;
Es gilt
False < True
ordtFalse) = 0
ord(True) = 1
Eine Variable dieses Typs belegt ein Byte. Es gibt folgende Verknüpfungen:
and logisches Und
OR logisches Oder
xoR logisches auschließliches Oder
OR und XOR haben gleiche Priorität und zwar eine kleinere als .VND.
Beispiel:
a OR b AND c XOR d
entspricht:
a OR (b AND o) XOR d
und damit (gleiche Priorität von OR und XOR, deshalb Auswertung von links nach rechts):
ta OR (b AND c)) XOR d
Außerdem gibt es noch die Negation NOT, die höchste Priorität hat:
NOT a AND b entspricht deshalb: (NOT a) ÄND b.
Umsteiger von BASIC (Was ist das? Nie gehön!) nach PASCAJ. wissen oft nicht, daß die Booleschen
Verknüpftingen in P.ASCAL dieselbe Priorität wie arithmetische Operatoren haben, Somit wäre
IP x>=0 AND x<10 THEN ...
fttlsch: ,AN’D“ hat Vorrang vor den Vergleichoperatoren, so daß zuerst „0 AND x“ zusammengefaßt
würde (in Standardpascal nicht erlaubt, bei MaxonPASÜ\L ist dies, falls x eine Ganzzahl-Variable ist,
eine binäre Verknüpfung, die stets den Wert ü hat), und übrig biiebe der unsinnige und syntaktisch
faische Mehrfachvergieich
IF X >= (0 AND X) < 10 THEN ...
Richtig wäre;
IF (x>=0) AND (x<10) THEN ...
Boolean-Werte können mit „Write“ au.sgegeben werden.
5 . Datentypen
121
Beispiel:
write(1=2)
^ibt „false“ aus.
5.3 Char
Ein „Char“ isi ein einzelnes Zeichen („Character“). Es wird wahlweise mit einfachen oder doppelten
.^•iführunj!;.szeichen eingeschlossen.
Folgendes w'ären also korrekte Char-Konstanten:
'A' "A” 'X' '2' .
Das letzte Beispiel hätte man tiuch anders darstellen können: Ein Hochkomma wird in
Hochkommata eingeschlossen, indem man es doppelt setzt, also ‘. Standard-PASCAL erlaubt es
nicht, ein Char mit doppelten Hochkomma einzuschließen, so daß dort die letztere die einzige
zulässige Darstellung ties Apostrophs wäre.
MaxttnPASCAL verwendet natürlich den normalen H-Bit-Amiga-Zeichencode. Nicht-schreibbarc
Zeichen sind die Codes von 0 bis 31 sowie von 128 bis 159. Dafür gibt es verschiedene Literalarten:
Zum einen wäre da die gewöhnliche Schreibweise „Chr(n)", wobei „n“ ein ganzzahliger Ausdruck im
Bereich von 0 bis 255 ist. Falls tier Parameter konsumt ist, kann die Chr-Funktion auch als Konstante
verwendet w'erden, d. h.
"CONST Linefeed = ehr(10)“ oder "CASE c OF ehr(13): ..."
sind möglich.
Ferner akzeptiert MaxonPASCAI. die von gewissen unter MS-DOS laufenden PASCAL--
Implementierungen her bekannte Schreibw'eise „#n“, wobei n eine ganzzahlige Konstante im zuläs¬
sigen Bereich ist. Und last not least kann man (da Charkonstanten äußerlich Ein-Zeichen-Strings
sind) wie bei Stringkonstanten verfahren, z.B. ‘'\lü oder ‘‘SOa als Ersatz für chr(lO). Näheres dazu
finden Sie im String-Kapitel.
5.4 Aufzählungs- und Ausschnittstypen
PASCAL bietet Ihnen die Möglichkeit, sich Datentypen selbst zu definieren. Eine einfache
Möglichkeit sind die Aufzählungstypen.
Man eizeugt diesen Datentyp ganz einfach, indem man die Werte, die jew'eils durch einen
Bezeichner repräsentiert werden, als Liste in innden Klammern aufzählt. Ein beliebtes Beispiel:
TYPE Wochentag =
(Montag, Dienstag, Mittwoch, Donnerstag,
Freitag, Samstag, Sonntag);
MaxonPASCAL
122
Diese Zeile definiert niclit nur den neuen Datentypen „Wochentag“, sondern auch die sieben
Konstanten „Montag“ bis „Sonntag". Deshalb dürfen diese Bezeichner zuvor noch nicht definiert
sein.
„Wochentag“ ist ein Datentyp, der die sieben diskreten Werte „Montag“ bis ..Sonntag" umfaßt.
„Mittwoch“ z. B. ist eine Konstante mit dem Wert „Mittwoch“ - klingt seltsam, ist aber so.
Welche Eigenschaften hat ein solcher Datentyp, und was kann man damit machen? Die Elemente
sind geordnet; Es gilt Montag < Dienstag < Mittwoch < ... < Sonntag. Des weiteren haben sie
auch Ordnungszahlen: Ord(Montag)=ü, Ord(Dienstag) = 1 usw. Auch die Funktionen „Succ“ und
„Fred“ können auf Aufeahlungstypen angewendet werden, z. B. Succ{Montag)=Dienstag,
Pred(Ereitag)=Donnerstag. Das sind dann aber auch so ziemlich alle Operationen auf
Aufzählungstyixtn. Ihr Sinn ist im wesentlichen, Programme übersichtlicher zu gestalten, z. B. indem
man Wochentage nicht durchnumeriert, sondern wie im obigen Beispiel über ihre Namen verwaltet.
Eine Variable eines Aufeählungstyps belegt übrigens immer 2 Bytes.
Die andere Klasse von einfachen selbstdefinierten Datentypen sind die Ausschnittstypen. Dazu
nimmt man sich einen bereits existierenden geordneten Datentypen, also einen Ganzzahltypen,
Boolean, Char oder einen Aulzahlungstypen und .schränkt seinen Wertebereich auf ein beliebiges
Interval ein. Das folgende Programmfragment enthält einige Ausschnittstypen:
TYPE
Positiv
Wochentag
Arbeitstag
Gross
Ziffern
l..Maxlnt; { Dies Ist ein Ausschnitt aus Integer,
der alle positiven Integerzahlen umfaßt }
(Montag, Dienstag, Mittwoch, Donnerstag, Freitag,
Samstag, Sonntag); { kennen wir schon }
Montag..Freitag; { ein Ausschnitt aus dem Typen
"Wochentag" )
'A' .. 'Z'; { 26-elementiger Aussohnittstyp von
"Char" )
■0' .. '9'; ( auch dies ist ein Char-Ausschnitt )
VAR
n: Positiv; { die Variable "n" kann nur positive Werte
haben }
1: 0 .. 2673142; { ein Ausschnitt aus "Longint" }
PlusHlnusCard;-MaxCard .. +HaxCard; { auch dies ist ein
Seltsam;
Heute:
IstLelder:
HätteGern:
Ausschnitt aus "Longint" }
False . . True; { lunständliche Art, eine Boolean-
Varlable zu deklarieren }
Wochentag;
Montag..Freitag; { ist im Vergleich zu "Heute"
auf 5 Werte beschränkt )
Samstag..Sonntag; ( Achtung: beliebter Fehler ist,
hier "(Samstag,Sonntag)" zu
schreiben. Überlegen Sie doch
• mal, warum das nicht gehtl }
5. Datentypen
123
Man definiert Ausschnittstypen also, indem man eine Unter- und eine Obergrenze angibt. Beide
Grenzen müssen Konstanten sein; die untere muß kleiner als die obere sein, denn sonst meldet der
Compiler einen Fehler.
Eine Variable eines Ausschnittstyps verhält sich exakt wie eine des Grundtyps. Einziger Unterschied:
Bei jeder Wertzuweisung wird geprüft, ob die Variable im erlaubten Bereich liegt; andernfalls bricht
das Programm mit einer Fehlermeldung ab.
5.5 Stringtypen
Ein String ist eine beliebig lange Folge von Zeichen. Rs gibt zwei verschiedene Stringtypen:
• Die Deklaration ,.String|n]“ ist identisch mit ,Array |l..n] of Char". Das Symbol „String“ ohne
hängenangabe entspricht „String[80]“. Zwar ist „String" kein Typbezeichner, sondern eine sog.
Directive. Seit Version 1.5 von KICK-P.ASCAL kann „String" aber überall als Pseudo-
Typbezeichner verwendet werden, z. B. auch als Typ in Parameterlisten.
• Der Datentyp „Str“ ist ein Zeiger auf einen String.
Beim ersten Typ müssen Sie eine maximale Lange festlegen. Hier können Sie über den Index auch
jedes Zeichen einzeln ansprechen. Das Ende wird mit einem Zeichen chr(0) markiert. Weil auch die¬
ses Zeichen ein Byte benötigt, können Sie in einem „StringjSj“ effektiv höchstens 4 Zz^ichen unter¬
bringen.
..Str“ ist nichts weiter als ein Pointer. Das ;\M1GA-Betriebssystem benötigt häufig solche Zeiger auf
Texte, und das ist auch der einzige Grund, warum dieser Typ in MaxonPASCAL implementiert wur¬
de.
Er Lst nämlich eine etwas haarige Angelegenheit. Betrachten Sie bitte einmal folgendes Programm:
Program strings;
Var sl:8tr; s2:String[10];
Begln
s2:='Hallo';
s1:=b2;
s2:='Horrido';
writeln(sl)
End.
Raten Sie mal, welche Ausgabe dieses Programm macht: Zuerst wird in „s2“ der Text 'Hallo' abgelegt
(s2[ 11 = ’H',..., s2[5] =’o’, .s2[6] =chr(0)). In der nächsten Zeile wird „s2“ an „sl“ zugewiesen.
„sl" besitzt aber keinen eigenen Speicher außer den 4 Bytes, die ein Pointer lienötigt („s2“ belegt 10
Bytes). Vielmehr zeigt der ZEIGER „sl“ nach dieser Zeile auf die Variable „s2". Wenn dann in der
nächsten Zeile ein anderer Text an „s2“ zugewiesen wird, ändert sich auch der „Inhalt“ von „sl“.
Ergn gibt das Programm ‘Horrido’ aus - ein eklatanter Verstoß gegen die Prinzipien gepflegter PAS-
C.Al.-Programmierung.
MaxonPASCAL
124
An diesem Beispiel sehen Sie auch, daß Sie den Wert, auf den „sl“ zeigt, erhalten, ohne (wie bei
normalen Pointern notwendig) „slzu schreiben. Das liegt daran, daß .MaxonRASC.AI. Strings
intern ohnehin nur über ihre Speicheradresse verwaltet werden.
Gefährlich wird es (und auch das dürfte es in PASQU, eigentlich nicht gelx'ii), wenn im obigen
Beispiel „s2“ lokal in einer Procedure und „sl“ als globale Variable tieklariert w'äre. In tler Prozedur
wird „sl“ zunächst ein Zeiger aut die lokale Variable „s2“ zugewie.sen. Wenn das Programm dann die
Prozedur verläßt, existiert die Variable „s2“ garnidit mehr, untl „sl“ zeigt deshalb irgentlw'o in die
Wallachei. Sobald der entsprechende Sjteicherbereich wieder benutzt wiixl, wird der Wert von „sl“
geändert.
Dieser Exkurs zeigt, daß Sie den Str-Typ hauptsächlich im Zusammenhang mit der .AMIGA-
Betriebssystemprogratnmierung versvenden sollten. Er ist auch ohnehin nicht so interessant, weil
man eine solche Variable weder über Reatl/ReadLn einiesen noch die Zeichen einzeln ansprechen
kann. Alles, was Sie mit „str“ anfangen können, ist:
• eitle Variable zuweisen.
• eine Stringkonstante zuweisen, z.B. “sl: = 'Ilalleluja’'‘. Eine solche Ziweisung kann bedenken¬
los auch in einer Prozedtir niedrigeren Ranges erfolgen, denn die Konstante liegt nicht im
Variablenspeicher, sondern im Progratnmeode.
• mit anderen Strings vergleichen.
• mit Write(ln) ausgeben.
• als Parameter in Funktionsaufrufen verwenden.
Damit wären wir auch schoti heim nächsten ThemaiOperationen auf Strings.
MaxonPASCAL hat folgendes auf latger:
• Wertzuw'Ci.sungen - wie oben gesehen.
• Au.sgahe tnit Write./'X'riteLn.
• Eingabe mit Read./ReadLn (geht nicht mit Str).
• Vergleichsoperationen =, <>, <, < = , >, >=. Es kann auch ein String mit einem Char
verglichen werden.
• Verbinden mit „+" oder l\ct„C otical" - Funktion - Mit„t.b/iv“ auf Au.sschnitte zugreifen.
Stringkonstanten können wahlweise mit ‘' (wie in Standard-FASCAL) oder mit “ “ eingeschlosscn
werden. Es gibt die Möglichkeit, Steuerzeichen in Strings einzusetzen: Man unterbricht den String
mit' oder „ - aber mit dem selben Zeichen, mit dem man ihn begonnen hat - untl kann dann entwe¬
der mit $xx eine Hexadezimalzalü oder mit \ eine Dezimalzahl einschieben.
Beispiel:
Program Steuercodes;
Begin
writelnt'xxx aaa'$0d'bbb');
{ $0d oder dezimal 13 entspricht dem Code "CR“ ("Wagenrücklauf").
Der Cursor springt an dieser Stelle an den Zeilenanfang, so daß
"XXX" von "bbb" überschrieben wird. }
5. Datentypen
125
writeln("Zeile 1"\10$a"Zelle 2");
{ Dezimal 10 = Hex $a entspricht "LF" ("I,inefeed"/"Zeilenvor-
Bchub"). Hier werden zwei Zeilenenden eingesohoben. )
writelnC’ '$9b'33mJetzt '\155’32;4mwird' •s'\155'31;0;3m bunt 1'$0a);
{ Der Steuercode dez 155 bzw. Hex $9b heiSt "Escape" oder "CSI"
("Control Sequence Introducer" - "Steuersequenzeinleiter"). Damit
haben Sie enorm viele Möglichkeiten, die ich hier nicht einzeln
aufzählen kann. Setzt man z. B. dahinter eine oder mehrere
Dezimalzahlen (ggf. durch ";" getrennt) und beschließt die Sequenz
mit einem kleinen "m", wird das Aussehen des Textes beeinflußt: die
Zahlen 0..7 stellen verschiedene Textattribute ein (unterstrichen,
kursiv, ...) und Zahlen 30..37 setzen die Schriftfarbe.
Außerdem fällt auf, daß
a) der String mit einem Steuercode beginnt, indem der Leerstring ''
vorangestellt wird,
b) ein Apostroph ' im String enthalten ist, indem er doppelt
gesetzt wird und
c) die Zeichenkette mit einem Steuerzeichen endet, ohne daß
dahinter noch ein Hochkomma stehen muß. }
writeln('Zelle 4'\n'Zeile'\e'33;Om 5');
{ Hinter können Sie auch die Buchstaben "n" und "e" setzen.
Ersterer entspricht dem Zeichen LF (Code $0a), letzterer "CSI"
(Code $9b). )
End.
Prohlcmatiscli wird es, wenn auf oben beschriebene Weise ein Nullbyie in einen String eingesetzt
wird. Sowohl MaxonP.VSCAI. als auch das MllGA-Betricbssystem betrachten dies in der Regel als
Stringendemarkierung, so daR der Rest eventuell verloren geht. Wenn Sie einmal eine solche Null
benötigen - z.B. bei der Intuition-Funktion JVspkiyAleti“ - müssen Sie den String äußerst vorsichtig
behandeln.
Wenn ein String mit einem Steuerzeichen beginnen soll, können Sie am Anfang statt des Iiterstrings
auch das Zeichen verwenden. Außerdem kann „#“ iilaerall als Ersatz für den Backslash „\“ ver¬
wendet werden. Eine Zeile aus dem obigen Beispiel könnte also auch so aussehen:
write(#$9b'33mJetzt ’#155•32;4mwird■'s■#155'31;0;3m buntt'$0a);
Durch solche Steuercodes kann ein String ganz schön lang werden. Er darf aber normalerweise das
Zeilenende nicht überschreiten. Zu diesem Zweck gibt es die Möglichkeit, die beiden Zeichen
in den String einzuschieben. Dahinter können dann beliebig viele Zeilenenden, heer/eichen oder
sogar Kommentare stehen, bevor der String fortgesetzt wird.
writet'Ein Gedicht \n\n\e ' 32mvon Douglas Adams '\ii\n\&
\x'[33mO zerfrettelter Grunzwanzling1'\n\&
'Dein Harngedränge ist für mich'\n\&
MaxonPASCAL
126
'Wie Schnatterfleck auf Bienenstich. '\St
\n\n\c ■31mDen Rest erspare ich Ihnen.*)
Dieser Befehl gibt einen mehrere Zeilen langen Text auf einen Schlag aus. Allerdings ist in
MaxonPASCAL die linge von String-Konstanten auf 400 Zeichen beschränkt - um einen Roman aus¬
zugeben, werden Sie also doch mehr als eine Zeichenkette benötigen.
Im obigen Beispiel tauchen außerdem die Einschübe „\c“ und „\x“ auf.
„\x" ents[iricht dem Escape-Zeichen #f Ib. Zusammen mit einer folgenden eckigen Klammer ist
es äquivalent zum CSI-Zeichen. Diese Folge hat aber den Vorteil, daß sie auch vom Druckertreiber
verstanden wird. Man kann \x’[‘ mit \c abkürzen.
Es gibt noch zwei wichtige Funktionen zur Stringbehandlung; „Concat“ und „Copy“;
Concat(Btringl, strlng2, ...)
hängt die übergebenen Strings zusammen. Das Ergebnis wird als „temporärer String“ zurückgege¬
ben.
„'Ä'as ist das?“ Die Variablen eines „String[N]“-Typs besitzen jeweils einen für sie reservierten (N
Brtes langen) Speicherbereich. Auch eine Stringkonstante liegt an einer bestitiimten Stelle im
Speicher, und ein „Str“-Zeiger zeigt wenigstens auf eine Speicheradresse. Das Ergebnis, das
„Concat“ zurückgibt, hat aber keinen vorher bestimmten Speicherplatz, vielmehr wird unmittelbar
vor dem Zusammenhängen irgendwo die benötigte Menge Speicher reserviert (denn das Ergebnis
kann ja beliebig lang werden) und muß nachher wieder freigegeben werden. Der String ist also
quasi nach dem Lesen zu vernichten.
(Wüßten Sie schon: Dokumente der höchsten NATO-Geheimhaltungsstufe tragen den Stempel
„DBR“ - „Destroy Before Reading“....) Von der internen Verwaltung dieser Strings merken Sie als
PASCAL-Progiammierer in der Regel nichts, denn wenn Sie einen „Concatinierten" String mit Write
ausgeben oder an eine Stringvariable zuweisen, managed das PASCAL-Lauf/.eitsystem das Ganze für
Sie.
Eine Einschränkung gibt es aber: Ein temporärer String kann nicht an eine „Strt-Variable zugewiesen
werden. Grund: Ein temporärer String ist ja nur „von begrenzter Lebensdauer“, und eine Str-
Variable hat ja auch keinen Speicher, in dem sie den String aufbewahren könnte, sondern bnn
lediglich auf eine Zeichenfolge zeigen. Und ein Zeiger auf einen String, der sich bald in Wohlgefallen
auflöst, wäre ja wenig sinnvoll.
Deshalb ist es natürlich auch nicht erlaubt, solche Strings als Parameter an Prozeduren und
Funktionen zu übergeben, die einen „Str“-Parameter erwarten. Dazu gehören z. B. die PASCAL-
Standardprozedur ,Assign(datei, namestr)", die Funktion „Pos(strl, str2)“ und jede Menge AMIGA-
Systemfunktionen. Sie müssen hier also bei Bedarf das „Concat“-Ergebnis zunächst an eüie
Stringvariable zuweisen. Übrigens; Sie können Strings ersatzweise auch mit „+“ aneinanderhängen.
5. Datentypen
127
Beispiel:
s ;= IHallo' + 'Du'+Concat(Concat {'AlterEimer'Wie) + 'Geht's', '?')
Danach liat s den Wert „HalloDuAlterEinierWieGeht's?“
Copytstring, poe, len)
Diese Funktion liefen einen „len“ Zeichen langen Ausschnitt ab Position „pos“ aus der Zeichenkette
„String“. Auch hier ist das Ergebnis ein temporärer String, es gilt also sinngemäß dasselbe wie bei
der Krtnkaiination (lachen Sie nicht, dieses Won gibt s wirklich).
writetCopyt'PASCAL the best - - the restl',8,3))
gibt „the“ aus.
Wahrscheinlich war die erste Programmiersprache, die Sie gelernt haben, BASIC, so daß Sie es wahr¬
scheinlich gewohnt sind, mit „mid$(a$,17,l)“ auf das 17te Zeichen von „a$“ zuzugreifen. Trotzdem
sollten Sie (so schwer das auch oft fällt) mit dieser schlechten Gewohnheit brechen und stets a[171
statt Copy(a,17,l)) schreiben (Vorausgesetzt, a ist eine Variable eines String[x]-Typs). Dafür gibt es
gleich vier gute Gründe:
1. Ersteres ist kürzer.
2. Es geht deutlich schneller.
3. Außerdem ist es Standard-PASCAL-kompatihel.
4. „Copy“ gibt stets einen String zurück, so daß Sie das Ergebnis nicht an eine Char-Variable zuwei¬
sen können, auch w'enn es nur ein Zeichen lang ist.
Bei einem Stringausdruck, einer Zeichenkettenkonstanten oder einer „Str“-Variablen ist es nicht
möglich, wie oben beschrieben, auf ein einzelnes Zeichen zuzugreifen. Dafür gibt es - als besonde¬
res MaxonPASCAL-Feature ab Version 1.5 - eine andere Schreibweise: hinter jeden Zeichenketten¬
ausdruck kann ein Punkt, gefolgt von einem Pseudo-Index, gesetzt werden.
Ein Beispiel:
Program streawkceuR; Var Vorname, Nachname: String;
i: integer;
Begin
writet'Vorname: '); readln(Vorname);
write('Nachname: '); readln(Nachname);
For i: = 12 Dovmto 1 Do
writet'Ihr Name ist'.[i]);
writelnt':')
For i:=Length(Vorname)-fLength(Nachname)-fl Downto 1 Do
write ( (Vorname+' '-fNachneime) . [i] )
End.
MaxonPASCAI
128
Dieses Progrämnichen fragt den User nach seinem Namen und gibt dann erst den Text „Ihr Name
ist" und dann den vollständigen Namen rückwärts aus, indem es die beiden Stringausdrücke zei¬
chenweise von hinten nach vorn schreibt.
Was wäre in jenem Programm der Unterschied zwischen „VornamejS]“ und „Vnrname.|5]"? Ersteres
ist eine Char-Variable, nämlich das fünfte Element des Char-Arrays „Vorname“. Dieser Variablen
kann man z. B. auch einen Wert zuweisen. Das zweite ist ein Char-Ausdruck. so wie „Chr(k+8)“
oder „Succ(A) , und kann deshalb nicht auf der linken Seite einer Wertzuweisung auftreten.
„Stringausdruck. [Index]“ ist also identisch mit „CopyfStringausdnick,Index,1)", nur daß ersteres ein
Char und letzteres einen String liefert.
5.6 Pointertypen
Außer den normalen Pointern besitzt MaxonPASCAI noch einen typfreien Pointertypen namens
„ptr". Eine Variable dieses Typs kann auf einen beliebigen Typ zeigen - weshalb es auch nicht mög¬
lich ist, mit „ “ diese Variable anzusprechen. Natürlich kann auf einen solchen Zeiger auch nicht
New oder Dispose angewandt werden, denn es ist ja gar nicht klar, wie viel Speicher dabei reserviert
bzw. freigegelten werden muß.
Wahrscheinlich werden Sie sich jetzt fragen, welchen Sinn dann ein solcher Zeiger hat. Nun, im
Gegensatz zu normalen Zeigern kann an eine Ptr-Variable ein beliebiger Pointertyp zugewiesen w^er-
den und umgekehrt. Ein Beispiel:
Program Pointer;
Var pl:*Typl; p2:»Typ2; p:ptr;
Begin
... P!=pl; p2:=p; ...
Das Ergebnis dieser Zuweisungen: p2 zeigt auf dieselbe Variable wie pl, obwohl diese eigentlich ver¬
schiedene Typen haben (im nächsten Abschnitt werden Sie erfahren, wie so etwas auch einfacher
geht).
Jetzt werden Sie wahrscheinlich denken: OK, aber welchen Sinn hat SO ETWAS denn nun wieder?
Darauf sei ebenso kurz wie ausweichend geantw'ortet, daß Sie das zur System-Programmieamg
benötigen, worauf in einem der nächsten Kapitel noch eingegangen wird.
A'/iW und DISPOSE verwenden übrigens nicht den reservierten .Arbeitsspeicher, sondern die Exec-
Funktionen „Alhcmem“ und „Freemem", falls Ihnen das etwas sagt (falls nicht: erstere fordert:
„Bitte ein Kilo Byte!“ vom Betriebssystem Speicher an, letztere gibt ihn wieder zurück). Somit
schränken dynamische Variablen nicht Ihren Stack-Speicher ein. Es wird aber bei „New“ quasi Buch
geführt, w'elche Speicherbereiche reserviert wurden. Dadurch kann es zum einen bei „Dispose“
nicht zu einem Absturz kommen (Guru Meditation Number $81000009), und zum anderen ward der
Speicher am Programmende wieder ordentlich freigegeben
UntI noch eine Besonderheit hat MaxonPASCAI. im Zusammenhang mit Pointern auf Lager: Wenn
Sie einer beliebigen Variablen ein „ ^ “ voransiellen, erhalten Sie einen Zeiger auf diese Variable.
5. Datentypen
129
Beispiel:
Program Pointer2;
Var i:integer; p: ■'integer;
Begin
i:=26731; p:=^i; writeln(p*)
End.
Ein anderes Beispiel: „MyScreen“ sei der Zeiger, den Ihnen die Intuition-Funktion „OpenScrem“
(Typ: Screen) zuriickgegeben hat.
Mit der Prozedur „C/eflr&ree«“ aus der Graphics-lihrary wollen Sie nun diesen Bildschirm löschen.
Dazu brauchen Sie einen Zeiger auf den sog. Kastport des Screens, der als Feld (also nicht in Form
eines Pointers!) in der Screenstruktur {Struktur= Record) enthalten ist. Der Befehl sieht so aus:
ClearScreen(^MyScreen*.Rastport);
Die Schreibweise mit den zw'ei „ ^ “ ist zugegebenermaßen etwas ungewohnt. Hier sehen Sie auch,
daß die Auswertung quasi von rechts nach links erfolgt: Das erste „ ^ “ bezieht sich auf den ganzen
Austlruck „MyScreen .Rastport" und nicht nur auf „MyScreen“ (zumal ein Zeiger auf einen Zeiger
keine allzu nützliche Sache ist).
Natürlich sollten Sie sich hüten, einen Pointer zu DISPOSFn, den Sie mit „ “ auf eine NICHT durch
New erzeugte Variable gesetzt haben. Die Folge wäre aber nur eine Fehlermeldung, denn
MaxonPASC,AL paßt hier auf.
5.7 SET-Typen
Sets können ziemlich grt)ß werden: der Riemcntbereich darf bis zu 2 16 - 16 = 65520 Werte
umfassen, wobei stets die untere Grenze zur nächsten durch 16 teibaren Zahl abgerundet und die
obere zur nächsten höheren (!) durch 16 teilharen Zahl aufgerundet wird. So ist z. B.
VAR s: SET of 0..65519;
eine der größtmöglichen Mengen im Ixtnglnt-Bcreich. „1..65520“ geht nicht, denn lüer wmd die 1
auf 0 ab- und die 65520 auf 65536 aufgerundet. Im Integerbereich wäre entsprechend
VAR t:set of -32752..32767;
geratle noch möglich - also fast schon „Set of integer"!
Elementtypen können alle geordneten Datentypen sein, also Char, Boolean, Ganzzahl- und
Aufzählungstypen sow'ie Ausschnitte daraus.
Insgesamt gibt es folgende Verknüpfungen auf Mengen:
* Schnittmenge:
+ Vereinigung:
Differenz:
= Mengenvergleich:
<> Gegenteil von =
[1..8]*[5..10] = [5..8]
[1,2] -I- [2,6..10] = [1,2,6..10]
[-10..10]- [-Maxint.O] = [1..10]
[17,4,21] = [4,17,21] istTRUE.
MaxonPASCAL
130
<= Teilmenge:
>= genau andersrum:
IN „Ist Element von“:
[1,7]<=[0..10]
[0..10]>= [1.7]
5 IN [1..10]
Ist TRUE.
Ist TRUE.
Ist TRUE.
Auch hier gelten die normalen „Punkt- vor Strichrechnung“-Regeln:
X IN a-b*c entspricht x in (a-(b*c))
Sie sollten aber immer bedenken, daß Mengenoperationen in MaxonPASCAL (wie in wohl fast allen
anderen PASCAL-Implementierungen) nicht gerade schnell sind. Genaugenommen sind sie sogar
total lahm, vor allem dann, wenn die beteiligten Mengen groß w'erden. Deshalb sollten Mengen sol¬
chen Verwendung.szwecken Vorbehalten bleiben, bei denen es nicht auf Geschwindigkeit ankommt.
Eine Ausnahme gibt es aber: Falls hinter „IN" eine Mengenaufeählung steht, die ausschließlich aus
Konstanten besteht, wird dies von Ma.xonPASCAL zu einer Folge von Vergleichsoperationen opti¬
miert. So ist z. B.
L in [0,10..20,100..120]
erheblich schneller als
(L=0) or (L>=10)and<L<=20) or (L>.100)and(L<=120).
5.8 Strukturierte Datentypen: Arrays und Records
Strukturierte Variablen sind allgemein Zusammenfassungen mehrerer Variablen zu einer größeren
Einheit. Es gibt in PASCAL zwei Arten von solchen Variablen: Feldtypen (,Arrays“) und
Verbundtypen („Records“).
Betrachten wir zuerst die Felder. Ein Feldtyp wird definiert durch
"ARRAY" "[" Indextyp "]" "OF" Elementtyp
Der Indextyp kann ein beliebiger geordneter Datentyp sein, also ein Ganzzahltyp, Char, Boolean, ^jl
ein Aufzählungstyp oder ein Ausschnitt aus einem dieser Typen. In der Regel benutzt man hier aber
Ausschnittstypen. Der Elementtyp kann ein beliebiger Datentyp sein.
Es wird jedem Wert des Indextyps eine Variable des Elementtyps zugeordnet.
Ein Beispiel:
VAR Feld: AHRAY[1..10] OF F Char;
Die Variable „Feld“ besteht aus den zehn Elementen „Feldjl]“ bis „Feld] 10]“, die jeweils Char-
Variablen sind. Das Ganze ist übrigens idenüsch mit dem Datentypen „String] 10]“ (siehe Abschnitt 5
dieses Kapitels).
5. Datentypen
131
Alternativ hätte man auch so deklarieren können:
TYPE Feldlndex = 1..10;
FeldTyp = ARRAY[Feldlndex] OF Char;
VAR Feld: FeldTyp;
Der Elementtyp kann ein beliebiger Datentyp sein - also auch ein weiterer Array-Typ, z. B,
TYPE DreiD = ARRAY[-l..l] OF
ARRAY [ • a • . . ' z ' ] OF
ARRAY[Boolean] OF
Integer;
Das kann abgekürzt werden durch:
TYPE DreiD = ARRAY[-l..l, Boolean] OF integer;
Entsprechend kann man, wenn ,Arr“ eine Vaiiable des Typs „DreiD“ ist, ein Element wahlweise mit
Arr[ i+1 ] [ ’x' 1 [ i=j ]
oder
Arr[ i+1, 'X', i=j ]
ansprechen.
Die Syntax für „Array-Typ“ ist also:
"ARRAY" "[" GeordneterTyp { GeordneterTyp } ”]” "OF"s Typ
Die Anwendungsmöglichkeiten von Arrays sind so vielfältig, daB jeder, der überhaupt schon einmal
in irgendeiner Sprache programmiert hat, auf Anhieb zahlreiche Beispiele dafür aus dem Schatz sei¬
ner Erfahrungen nennen kann. Deshalb will ich Sie hier nicht mit einem Beispielprogramm dafüi
langweilen, sondern gleich zum zweiten strukturierten Datentyp übergehen: dem Record.
Ein Record- oder Verbundtyp falät mehrere Variablen beliebigen, auch unterschiedlichen, Typs zu
einer Verbundvariablen zusammen. Ein klassisches Beispiel aus der Mathematik: eine komplexe
Zahl besteht aus einem Realteil und einem Imaginärteil, die jeweils reelle Zahlen sind, ln PASCAI
sähe das so aus:
TYPE Komplex = RECORD
Re: Real;
Im: Real
BND;
Das kann abgekürzt werden zu:
TYPE Komplex = RECORD
Re« Im: Real
END;
MaxonPASCAL
132
Eine Variable .pc“ des Typs „Komplex" besteht dann aus zwei „Feldern“, die „x.Re" und ,x.lm“ heißen
und jeweils Real-Variablen sind.
Ein anderes Beispiel: Von lOÜOO Studetiten sollen Vorname, Naehname (jeweils Strings mit bis zu 40
Zeichen) und .Matrikelnummer (Longlnt)) gespeichert werden.
Dies läßt sich realisieren, indem man drei Arrays deklariert: Zwei Stringarrays für die Vor- bzw.
Nachnamen und ein ,„ARRAY OF Long“ für die Matrikelnummern. Aber sinngemäß gehören ja nicht
alle Vornamen zusammen, sondern jeweils der Vorname, der Nachname und die Nummer jedes ein¬
zelnen Studenten. Lm die.se Zusammengehörigkeit im Programm klarzumachen, bietet sich die
Verw-entlung von Records an:
VAR Studies = ARRAY [1..10000] OF RECORD
Vorname, Nachname: String[40];
Matrlkelnmnmer: Long
END;
Eine Zuweisung an den k-ten Studenten könnte dann so ausseheii:
Studies tlt]-Vorname: = 'Willi';
Studies[k]-Nachname:= 'Wacker';
Studiestk] -Matrikelnuimner:= 3710815;
Einige Angaben zur Syntax:
Record-Typ: "RECORD" Feldliste "END"
Feldliste: { Bezeichner { Bezeichner ) ":" Typ I ";" ] }
[ Variantenteil ]
Variantenteil: "CASE" [ Bezeichner ":" ] Typ-Bezeichner "OF"
{ Konstante { Konstante ) . "{" Feldliste ")"
( ] }
Bevor ich den „Variantenteil" erläutere, möchte ich darauf hinweisen, daß die Feld-Bezeichner einer
jeden Feldliste einen eigenen Gültigkeitsbereich haben. Dies bedeutet, daß verscheidene Record-
Typen gleichnamige Felder haben können und daß ein Feld einen Namen haben kann, der bereits
vergeben ist. Einzige Bedingung ist, daß innerhalb eines einzelnen Records keine zwei Felder den
gleichen Bezeichner tragen dürfen.
Oft kommt es vor, daß man in einem Recordtypen Daten speichern will, tiie sich gering unterschei¬
den. Beispiel: Es soll der Warenbestand eines K;iufliau,ses verwaltet werden. Wir begnügen uns
zunächst mit der Warenbezeichnung, dem Verkaufspreis und einer Warengruppe. Bei 1-ebensmitteln
wollen wir aber zusätzlich das Verfallsdatum und bei Kleidung die Konfektionsgröße speichern. Der
erste Versuch mit einem normalen Record und einem Aulziihlungstypen für die Kategorie könnte so
aussehen:
TYPE Warengruppe = (Lebensmittel, Kleidung, Sonstiges);
Ware = RECORD
Bezeichnung: STRINGtSO];
5. Datent>T3en
133
Preis: RECORD { Schachtelung von Record-Typenl }
DM: integer; { Mark }
Pf: 0..99 { Pfennige }
END;
Kategorie: Warengruppe;
Verfall: RECORD
Tag, Monat, Jahr: integer
END;
Konfgroease: integer;
END;
Der Haken an der Sache: Wir benutzen immer entweder das Verfallsdatum oder die Größe oder
keins von beiden und verschwenden deshalb stets mindestens ein Feld. Das können wir mit einem
Varianten-Teil ändern:
Ware = RECORD
Bezeichnung: STRINQ[50];
Preis: RECORD { Schachtelung von Record-Typenl }
DM: integer; { Mark }
Pf: 0..99 { Pfennige }
END;
CASE Kategorie: Warengruppe OF
Lebensmittel: (Tag, Monat, Jahr: integer);
Kleidung: (Konfgroesse: Longint);
Sonstiges: ( );
END;
Die CASE-Zeile bewirkt zunächst einmal, tlaß ein Feld „Kategorie“ des Typs „Warengruppe“ einge¬
richtet wird. Der ganze Rest der Feldliste ist dann ein Varianten-Teil. Jede Variante beginnt mit einer
Liste von Konstanten (im Beispiel bestehen die „Listen“ jeweils nur aus einer Konstanten), gefolgt
von einem Doppelpunkt - also ähnlich wie Ixim CASE-Statement. Dahinter folgt jeweils eine
Feldliste - aber diesmal nicht mit „RECORD".END“, sondern von ninden Klammern umschlossen.
Die Feldliste kann übrigens auch leer sein, wie Sie in der Zeile „Soastiges“ sehen.
Was hat das dann zu bedeuten? Die Felder Jag“, „Monat" und .Jabr“ belegen den selben Speicher
wie das Feld ..Konfgroesse“. Die Zeile für den Fall „Sonstiges“ ist vollkommen überflüssig, fördert
aber die I.e.sbarkeil, weil dadurch klar wird, daß das Feld „Kategorie“ auch diesen Wen annehmen
können soll. Als Beispiel dafür, wie man mit solchen Records arbeitet, hier eine Prozedur zur
Warenau.sgabe:
PROCEDÜRE Ausgabe(W: Ware);
BEGIN
writelntW.Bezeichnung);
writeln(W.Preis.DM , •.• , W.Preis.Pf);
IF Kategorie=Lebensmittel THEN
writeln('Haltbar bis: ', W.Tag, , W.Monat, , W.Jahr)
ELSE
IF Kategorie=Kleidung THEN writeln('Größe Konfgroesse )
END;
MaxonPASCAL
134
Wie Sie sehen, sind die Felder des Variantenteils ganz normale Record-Felder, nur daß sie sich zum
Teil überlappen. Eigenüich sollte es zu einer Laufzeit-Fehlermeldung führen, wenn man auf „Tag"
zugreift, obwohl „Kategorie“ den Wert „Kleidung“ hat. MaxonPASCAL prüft dies aber nicht und
überläßt es so Ihrer Verantwortung.
Der Variantenteil sieht zwar auf den ersten Blick wie ein CASE-Befehl aus, aber hier ist kein ELSE-
Teil erlaubt. Auch können keine Au.sschnitte wie „Konstl..Konst2'' von Konstanten angegeben wer¬
den. Jeder Record kann höchstens einen Variantenteil haben. Falls Sie mehr benötigen, können Sie
das über geschachtelte Records erreichen.
Beispiel: In unser Record soll noch die bevorratete Menge autgenommem werden, entweder in
Kilogramm, Litern (Real-Zahl) oder in diversen Stückzahlen (Longlnt).
TYPE
Warengruppe = (Lebensmittel, Kleidung, Sonstiges);
Hass = (Masse, Volumen, Flaschen, Kisten, Stueck);
Ware = RECORD
Bezeichnung: STRIHO[50];
Preis: RECORD
DM: integer;
Pf: 0..99
END;
Menge: RECORD
CASE Einheit: Mass OF
Masse: (Kilogramm; Real);
Volumen: (Liter: Real);
Flaschen, Kisten, Stueck: (Anzahl: Longlnt);
END;
CASE Kategorie: Warengruppe OF
Lebensmittel: (Tag, Monat, Jahr: integer);
Kleidung: Konfgroesse: Longlnt);
{ Hier wurde die überflüssige Zeile weggelassen )
END;
Der Mengen-Record besteht auschließlich aus einem Variantenteil (außer dem Feld „Einheit“, das es
ünmer gibt). In unsere Prozedur .Ausgabe“ können wir nun an geeigneter Stelle folgendes einfügen:
CASE W.Menge.Einheit OF
Masse; writeln(W.Menge.kllogramm , 'kg');
Volumen: writeln(W.Menge.Liter, 'Liter');
Flaschen; writelntW.Menge.Anzahl, 'Flaschen');
Kisten: writeln(W.Menge.Anzahl, 'Kisten');
Stueck: writeln(W.Menge.Anzahl, 'Stück');
END;
Das Ganze hätte man mit einer WITH-Anweisung abkürzen können, aber das soll jetzt nicht unser
Thema sein. Statt dessen noch einige Anmerkungen zu „Variant parts“: das Feld hinter dem „CASE“
„ kann nicht nur - wie in unseren Beispielen - als Aufzählungstyp, sondern als beliebiger geordneter
Typ definiert werden, d. h. Boolean, ganzzahlig oder Char. In der Regel drängt sich die Verwendung
5. Datentypen
135
eines Aufzählungstyps aber geradezu auf. Die Konstanten der Varianten müssen aber zu diesem
Datentyp passen. E,s ist niclit nötig, für alle denkbaren Werte eine Variante anzugeben, z. B. wairde
im ttbigen Beispiel an Schluß die Zeile für „Sonstiges“ weggelassen.
Es ist auch nicht erforderlich, ein Feld zum Alispeichern der Variante einzurichten. Wenn aus
irgendeinem anderen Zusammenhang hervorgeht, welcher Zweig benutzt wird, reicht es, hinter
dem „C.4SE“ nur einen Typ-Bezeichner anzugeben.
TYPE
Komisch = RECORD
Inhalt: STRING[10];
Nummer: Longint;
CASE integer OF
0, 1: (Flag: Boolean;
Operandi, OperandZ: Real);
2, 3, 4: (Parameter: Real);
5: (Fehlercode: integer;
CASE Boolean OF
true: (Re, Im: Real);
false: (Wert: Double)
)
- 1 : ()
END;
Hier haben wir auch ein Beispiel für Felddeskriptoren der Typen „Integer“ und „Botriean“ und für
geschachtelte Varianten-Teile.
Eine Record-Variable mit Variantenteil belegt stets so viel Speicher, wie die längste Variante
benötigt. Der Jensen-Wirth-Standard kennt für dynamische (also über Pointer referierte) Record-
Variablen mit Variant Part eine besondere Version der „NEW"-Anweisung, bei der die gewünschte
Variante angegeben wird. 'X'äre z. B. „P" ein Pttinter auf den oben definierten Datentypen
„Komisch“, so würde
New (P, 5, false)
für die dynamische Variable „P ^ “ genau so viel Speicher allozieren, wie die Variante „5“ mit
Llnterrvariante „false“ belegen würde,
New (P, -1)
würde entsprechend Platz für eine Variable mit leerem Variantenteil machen uswc Ich verwende
ixiwußt den Konjunktiv, denn MaxonPASCAL unterstützt dieses Feature nicht. Sie vergeuden also
evtl, etwas Speicherplatz.
MaxonPASCAL
136
5.9 Typkonvertierungen
MaxonPASCAI. „managecl" im allgemeinen die Kombinaüon unterschiedlicher Datentypen selbst¬
ständig, so daß Sie sich darüber keine Gedanken zu machen brauchen. Der Compiler konvertiert
Datentypen, wenn es sinnvoll ist (z.B. Integer ung Longint) und meldet Fehler, wenn die Typen
nicht zusammenpassen, z.B. Real und Pointer. Hin und wieder kommt es aber vor, daß Sie dem
Compiler Ihren Willen aufzwingen müssen.
Beispiel:
Program IntToLong;
Var a,b:integer;
Begin a:=26731; b:=20000; writeln(a+2*b) End.
Da beide Variablen vom Typ „Integer" sind, rechnet das Programm in diesem Wertebereich - und es
kommt zu einem Überlauf, denn der größte in „Integer“ darstellbare Wert ist Maxlnt=32767. Im
Bereich „Longint“ könnte der Ausdruck aber korrekt ausgewertet werden.
Für Sülche (und andere) Zw'ecke gibt es in .MaxonPASCAL die Möglichkeit zur Typumwandlung.
Dazu verwendet man den Bezeichner des gewoinschten Typs (hier; „Longint" bzw. „Long“) wie eine
Funktion.
Beispiel:
... writeln(Long(a+2*b)) ...
Dies ist zwar syntaktisch richtig, bringt aber noch keine Verbesserung unseres kleinen Programms,
denn der .Ausdruck wird nach wie vor zunächst als „Integer" airsgewertet und erst danach in „Long"
umgewandelt. Wenn Sie den Compiler dazu zwingen wollen, tatsächlich in „Long" zu rechnen, müs¬
sen Sie dafür .sorgen, daß die Bestandteile des Au.sdruck.s vom Typ „Long" sind:
... writeln(Long(a)+Long(2)*Long(b)) ....
Dieser Ausdruck wird korrekt ausgewertet, ist aber etwas umständlicher als nötig. Es reicht ja
schließlich, w'enn ein Term „lang" ist, denn dann wird der Rest automatisch umgewandelt. /Aber
Vorsicht:
... writeln (Long(a) ■f2*b) ...
wäre falsch, denn (Punktrechnung vor Strichrechnung!) der Teil- ausdruck .,2*b“ wiixl zuerst in
„Integer“ ausgewertet und dann erst nach ..Long“ konvertiert! Richtig wäre dagegen;
wrlteln(a+Long(2) *b) oder writeln(a-f2*I,ong(b) ),
denn nun wird die Multiplikation korrekt als „Longint“ au.sgcführt und dann die Addition ebenfalls,
denn der zweite Summand ist ja lang.
5. Datentypen
137
Das klingt jetzt wahrscheinlich alles etwas verwirrend, aber in der Praxis werden Sie mit solchen spe¬
ziellen Fällen wohl nur selten zu tun haben. Die Moral aus der Geschieht' ist aber, daß Sie im
Zw'eifelsfall dem Compiler bei der Typkonvertierung nicht zutnel Freiheit lassen sollten.
Was wir hier mit „Long" gemacht haben, geht auch mit den vier anderen Ganzzahltypen. Sie können
damit - falls das einmal sinnvoll sein sollte - Zahlen sogar „verkürzen", also bleistiftsweise von „Long"
nach „Integer“ oder von „Cardinal" nach „Byte“.
Noch ein Beispiel:
Progreun Kardinal;
Var c:Cardinal;
Begln c:= 2*25000; writeln(c) End.
Falls Sie die Compiler-Option „M-ithmetic Overflow“ angewählt haben, wird ein Überlauf gemeldet,
denn die liier auftretenden Zahlen 2 und 25000 liegen beide sowohl im Integer- als auch im
Cardinalbereich.
In diesem Fall wählt der Com|iiler als Rechenbereich „IntegeP' (den Kontext, daß als Ergebnis eine
Cardinalzahl zwecks Zuweisung an eine solche Variable gewünscht wird, beachtet er nicht). Auch
hier können Sie ihn zum Rechnen in „Cardinal“ zwingen, in dem Sie eine („Cardinal(2)*2500ü“ bzw.
„2*Word(25000)“) oder beide Zahlen {„Würd(2)*Word(25000)“) mit „Word" oder „Cardinal"
zwangskonvertieren.
Bei all' diesen Beispielen ging es nur darum, einen korrekten Programmablauf zu gewährleisten. Es
gibt aber auch die Möglichkeit, mit Typumwandlungen'der Syntax ein Schnippchen zu schlagen,
nämlich bei den Pointern. Denn auch Poiniertypen und der String|iointer „stP‘ können untereinan¬
der umgewandelt werden. Außerdem können sie in Longlnt-Zahlen und umgekehrt Zahlen in
Zeiger verwandelt werden.
... Var p:‘Typ; ... New(p); writeln(Long(p)); ...
Dieses Fragment gibt die Adresse (als Zahl!) aus, auf die der Pointer „p“ nach dem „New" zeigt.
Noch ‘n Beispiel:
Program Speicherzugriff;
Var pi^Word;
w:Word;
Begin
p:=ptr($dffl80);
For w:=0 To MaxWord Do p‘:=w
End,
Hier wird der Pointer „p“ ganz gezielt auf die Adresse IdfflBO gesetzt, wo nichts anderes als die
Hintergiimglärbe des Bildschirms liegt, ln der For-Schleife wird dann diese Farbe schnell geändert.
Ergebnis: Ein Flimmern, an dem Ihr Augenarat seine Freude haben würde.
MaxonPASCAL
138
Achtung: Setzen Sie einen Zeiger (fast) nie auf eine ungerade Adresse! Der Prozessor MC 68000
(steckt in Ihrem AMIGA drin - es sei denn, Sie besitzen ein 680x0-Turbo-Board mit x=2,3,4,5,.. oder
einen Amiga 1200,2500,3000,4000,...) kann 16- und 32-Bit-Zahlen nur von geraden Adressen lesen
bzw. dahin schreiben. Bei ungeraden Adressen stürzt er auf einfachen 68000 Prozessoren ab (mit
der Guru Meditation Number $00000003.xxxxxx). Dies sollten Sie also, wie gesagt, fast nie tun.
„Fast" deshaib, weil 8-Bit-Daten (Byte, Shortlnt, Boolc'an, Char) durchaus an ungeraden Adres.sen
liegen dürfen.
Es gibt aber noch viele andere Möglichkeiten zur Typwandlung. Da wären zum einen die geordne¬
ten Datentypen, also Boolean, Char, Ganzzahl-, Aufzählungs- und Ausschnittstypen, die allesamt in
beliebiger Kombination wandelbar sind. So können Sie z. B. „Char(n)'' als Ersatz für die Funktion
„Chr(n)" oder „Integer(x)“ statt „Ord(x)“ verwenden.
Das sollten Sie aber besser sein lassen, denn für solche Sachen gibt es ja die erwähnten Standard-
PASCAL-Funktionen, während Typkonvertierungen eine Spezialität von MaxonPASCAL sind.
Interessant ist allerdings die Möglichkeit, von Integer nach Aufeählungstypen zu konvertieren, also
hier „ord“ umzukehren:
Program Woche;
Type
Tage=(Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag);
Var i: Integer; t: Tage;
Begin
For i:=0 to 6 Do
Begin t:=Tage(i);
If t In [Samstag,Sonntag] Then
writeln('Wochenendel')
End
End.
Desweiteren bnn man alle geordneten Datentypen in Pointer und zurück wandeln. Auch in
Fließkommatypen lassen sie sich wandeln („Real(‘A’)" würde z. B. die Real-Zahi 65 iiefem), aber
nicht umgekehrt.
Pointer kann man, wie erwähnt, in andere Pointertypen oder in alle geordneten Datentypen konver¬
tieren. „Boolean(NIL)“ wäre z. B. eine besonders umständliche Schreibweise für „false“.
Die Datentypen „Real“ und „Double“ (bzw. „LongReal“) lassen sich lediglich untereinander umwan¬
deln, etwa wenn man eine bestimmte Rechengenauigkeit erzwingen will.
3. Datentypen
139
Hier ist eine Tabelle mit allen direkten Konvertiemngsmöglichkeiten;
nach:
geordnet
Pointer
Fließkomma
geordnet
X
X
X
Pointer
X
X
Fließkomma
•
X
P< = möglich, • = mit Umweg über „Trunc“ und „Round“)
5.10 Literale für Records und Arrays
Das AMIGA-Betriebssystem wurde in der Sprache C geschrietren. Dies hatte unter anderem zur
Folge, daß geradezu exzessiv mit Striicts (=Records) und über Zeiger verketteten Listen gearbeitet
wurde.
Wenn Sie von PASCAL aus die Betriebs.systemfunktionen nutzen wollen, müssen Sie deshalb immer
und immer wieder Records initialisieren.
Ein Beispiel: Um mit der Intuition-Funktion „OpenWindow“ ein Fenster zu öffnen, benötigt man
eine Variable des Typs „NewWindow“, der wie folgt tlefiniert ist:
TYPE
NevrtJindow = RECORD
LeftEdge,TopEdge,Width,Height: integer;
DetailPen.BlockPen: Byte;
IDCMPFlags,Flags: Long;
FirstGadget.Checkmark: ptr;
Title: str;
Screen.BitMap: ptr;
MinWidth,MlnHeight,MaxWidth,MaxHeight,_Type:integer
END;
Jedem der Felder müssen Sie jetzt einen Wert zuweisen, ln „normalem“ PASCAL sähe das etwa so
aus:
VAR Neu: NeWWindow; ...
Neu.LeftEdge: = 10; Neu.TopEdge: =20; Neu.VJidth: =620; ...
...oder SO:
WITH Neu DO
BEGIN
LeftEdge:=10; TopEdge:=20; Width:=620; ...
END;
MaxonPASCAL
140
Das ist natürlich sehr mühsam. Weil dies aber so oft nötig ist, bietet MaxonPASCAL Ihnen hier eine
interessante Hilfe; Wertzuweisimg auf einen Schlag! ln unserem Beispiel sähe das so aus:
Neu:=NewWindow(10,20,6 0,160,$200,$100f,Nil,Nil,'Fenster•,Nil,Nil,
200,50,640,200,1);
Und dann ist die ganze Struktur schon initialisiert! An diesem Beispiel sehen Sie, wie die Syntax aus¬
sieht: Erst kommt der Typbezeichner und dann in runden Klammern, jeweils tlurch Komma
getrennt, die Weile, welche die einzelnen Felder erhalten sollen, Falls Sie sich mit dem Amiga-
Betriebssystem nodi nicht so gut auskennen und Ihnen die Bedeutung dieses Records deshalb
unklai ist: betrachten Sie es „'halt als irgentlso 'n Record“. Das vorher beschriebene geht natürlich
mit jedem Recordtc-pen, also nicht nur mit denen, die zum Betriebssystem gehören, sondern auch
mit den von Ihnen selbstdefinierten.
’OC'elche Vor- und Nachteile hat das Ganze? Nun, es ist schön kurz. Andererseits müssen Sie tlie
jeweilige Stmktur genau kennen, denn hier kommt es auch auf die Reihenfolge der Felder an. Das
ist aber nicht so schlimm: bei tler „normalen“ Record-Initialisierung müssen Sie die Struktur eben¬
falls genati kennen, um zu vermeiden, daK Sie ein Feld vergessen. Der wohl gravierendste Nachteil
ist, daß diese Syntax zu keinem anderen P.ASCM. kompatibel ist, schon gar nicht zu ISO-Standard-
PASCAL. Ihre Programme sind dadurch nicht mehr auf andere Rechner oder Compiler übertragbar.
Deshalb sollten Sie (im Rahmen der .Vktion „satiberer programmieren“) diese Art der Zuw'eisung nur
im Zusammenhang mit MIIGA-Betricbssystem-Funktionen vewenden, die ja ohnehin nicht auf
andere Rechnersysteme übertragbar sind. Hier ist es w'ohl auch am nötigsten.
Bei Records mit einem sog. Variant Part (mit „GASE“) ist diese Art der Wertzuweisung nicht möglich.
Dafür geht es aber bei Arrays ganz genau so:
PROGRAM ArrayDemo;
TYPE Arr = ARRAY[1..10] of integer;
VAR
Feld: Arr;
i; integer;
BEGIN
Feld =Arr(17,4,21,47,11,42,0,8,15,26731);
FOR 1:=1 TO 10 DO
wrlte(Feld[i]:7)
END.
Beachten Sie bitte, daß auch hier runde Klammern zu verwenden sind.
Mit einem .ARRAY... ÜF CEAR“ geht tlas übrigens nicht - ist aber auch gar nicht nötig, denn das ist
ja ein String, unti dafür gibt es bekanntlich viel einfachere Möglichkeiten der Wertzuweisung.
Seit Version 2.0 von MaxonPASCAL existiert auch die Möglichkeit, mehrdimensionalen /Irrays und
geschachtelten Records auf diese Weise einen Wert zuzuweisen. Daz.u verwendet man einfach eine
Klammerebene mehr.
5. Datentypen
141
Beispiel;
PROGRAM Array2Deino;
TYPE Arr2 = Array [ l.,3, 0,.l ] OF integer;
VAR Feld2: Arr2;
BEGXN
Feld2:= Arr2({17,4), (42,0), (8,15)); );
END.
Denken Sie daran, daß dieses zweidimensinnale Array lediglich eine Abkürzung für .ARRAY [1..3]
OF ARRAY |0..11 OF integer" ist. So wird dann auch verständlich, daß wir hier drei Zahlenpaare
haben und nicht etwa zwei Tripel. Bei höheren Dimensionsanzahlen geht das analog.
Analog hehandeln wir auch geschachtelte Records:
PROGRAM RecRecRecDemo;
TYPE Rec = RECORD
Ncime; RECORD
Vor,Nach: STRING
END;
Adresse: RECORD
Strasse: RECORD
Name: String;
Hausnummer: integer
END;
Ort: RECORD
Piz: integer;
Name: String
END
END
END;
VAR Person: Rec;
BEGIN
Person:= Rec(('Zaphod', 'Beeblebrox'),
(('Industriestraße', 26), (65760, 'Eschborn')));
WITH Person DO
BEGIN
writein(Name.Vor, ' ', Name.Nach);
writeln(Adresae.Strasse.Name, ' ', Adresse.Strasse.Hausnummer);
writeln(Adresse.Ort. Piz , ' Adresse.Ort.Name)
END
END.
.Als kleines Extra lünktioniert diese Schachtelving auch bei Records, die .Arrays enthalten, und bei
.Arrays of Records“.
Ein Beispiel für letzteres;
PROGRAM ArrRecDemo;
TYPE Kon®lexVektor = ARRAY [1..5] OF RECORD
Re, Im: Real
END;
MaxonPASCAL
142
VAR x: KomplexVektor/
BEGIN
X!= Komplexvektor((0,1), (-3,2), (42,0), (8,15), (17,4));
END.
5.11 Dateitypen
Eine Datei wird in PASCAL durch eine Variable repräsentiert, und die braucht auch einen
Datentypen: einen FILE-Typen.
Die Syntax ist denkbar einfach:
Dateityp = "FILE" [ "OF" Typ ]
„Typ“ gibt dabei den Typ der Daten an, die in der Datei gespeichert werden scillen, Dabei darf es
sich nicht um FILE-Typen handeln - was sollte denn wohl auch „FII£ OF FILE OF...“ darstellen?
Es gibt einen vordefinierten FILE-Typ: „Text“ ist „FILE OF Char“. Und damit wären wir auch schon
bei den beiden grundlegend verschiedenen Dateitypen: Es gibt Textdateien und Nicht-Textdateien.
In Textdateien können Daten vieler unterschiedlicher Typen ein- und ausgegeben werden: Char,
String, Boolean (nur Ausgabe) und alle Zahlentypen, und zwar bei Bedarf alle in dieselbe Datei. Bei
der Ein- und Ausgabe werden die Daten als Folge von ASCII-Zeichen repräsentiert.
Nicht-Textdateien, also solche, bei denen der Elementtyp nicht „Char“ ist, sind an ihren festen
Elementtypen gebunden. Dafür ist dieser aber beliebig (außer, wie bereits erwähnt, Dateitypen). In
solche Dateien können also nur Daten eines ganz bestimmten Typs ausgegeben bzw. aus ihnen ein¬
gelesen werden. Die Daten werden in solchen Files im jeweiligen nicht unmittelbar lesbaren inter¬
nen Datenformat abgespeichen.
Grob gesehen ist eine Datei eine beliebig lange Folge von Daten. Ein Schreib- oder Lesezeiger wan¬
den von vorn nach hinten durch diese Datei. Auf das Dateielement, auf dem der Zeiger gerade
steht, kann man durch die Puffervariable zugreifen: Ist eine Datei als
VAR Dat: FILE OF Typ;
deklarien, so heißt die Puffervariable dazu „Dat ^ “ und ist vom Datentyp „Typ".
Zuerst muß man aber die Datei fürs Lesen oder Schreiben öffnen:
Reset(Dat) öffnet die Datei, die bereits existieren muß, zum Lesen.
Rewrite(Dat) öffnet sie für Schreibzugriffe. Falls sie noch nicht existiert,
wird sie erzeugt.
Woher „weiß“ das Programm aber, wolche reale Datei, also welches File auf der Diskette o. ä.,
gemeint ist?
5. Datentypen
143
Dazu gibt es zwei Möglichkeiten:
• Man k;mn der Datei VOR dem Aufruf von Reset/Rewrite mit der Prozedur .Assign“ einen String
als Namen zuweisen. Beispiel:
AssigntDat, ■PASCAL:Textdatelen/Textl');
Reset{Dat);
Der Name wird dann nach dem ,Assign“-Befehl in einem Puffer aufliewahrt. Achtung: Dazu ste¬
hen nur 30 Bytes zur Verfügung, so daß die Dateinamen nicht länger werden künnenl
• Man kann auch direkt beim Reset/Rewrite einen Dateinamen als zweiten Parameter angeben,
Z. B. SO: ‘
ResettDat, •PASCAL:Textdateien/Text1');
Hier darf der Dateiname beliebig lang sein.
Falls die Datei nicht geöffnet werden konnte, hat die Funktion JOResult“ einen von 0 verschiede¬
nen Wert, die Fehlernummer. Was nun geschieht, hängt davon ab, ob Sie „Reset oder „Rewrite ver¬
wendet haben: Im ersten Fall wurde die Datei zum l£sen geöffnet und enthält in der Regel Daten
(es gibt natürlich auch leere Dateien), die Sie jetzt der Reihe nach lesen können, bis die Funktion
„EofiDat)“ wahr wird und so das Dateiende anzeigt. Dazu dient die Prozedur „Get“-.
Get(Dat>
liest das nächste Element aus der Datei und legt es in der Variablen „Dat ab.
Get(Dat); Variable:= Dat*;
kann ersetzt werden durch:
ReadtDat, Variable);
Wenn Sie eine Datei mit „Rewrite“ zum Schreiben geöffnet haben, ist sie stets leer. Sie können nun
Daten in die Datei scbreiben, indem Sie sie zunächst in der Puffervariablen ablegen und dann mit
der Prozedur schreiben.
Beispiel:
Dat*:= Ausdruck; Put(Dat);
Auch dafür gibt es eine Abkürzung:
WritetDat, Ausdruck);
Soviel zur „normalen“ Dateihandhabung von Standard-PASCAL. MaxonPASCAL erlaubt aber auch
nicht-sequentiellen Dateizugriff, indem man mit der Prozedur „Seek“ den Zeiger an eine beliebige
Position setzen kann. Ferner kann man auf mit „Reset" geöffnete Dateien auch schreibend zugreifen,
wobei jeweils die Daten, auf denen der Dateizeiger gerade steht, überschrieben werden.
MaxonPASCAL
144
Außerdem gibt es noch typfreie Dateien. Sie werden einfach als „FILE“ ohne Tvpangabe deklariert
z. B. SO: . o .
VAR Datei: FILE;
ln diesem Fall gibt es dann keine Puffervariable („Datei ^ “), so dal,^ auch die Prozeduren ..Get“ und
„Pur nicht benutzt werden können. Nur mit den Prozeduren „BlockReact und ..BlockWriie" kann
aus typfreien Dateien gelesen bzw. in sie geschrieben werden.
6. Variablen und Konstanten
143
6. Variablen und Konstanten
6.1 Standard-Variablen
MaxonPASCAL stellt folgende Standard-Variablen zur Verfügung:
Input, Output (Text)
Die Standard-Ein- und Ausgabedateien
Zeiger auf die Basisadresse der Dos-Library.
MathBase (Ptr)
Zeiger auf die "Mathffp.libraiY'
MathtransBase (Ptr)
Dieser Pointer zeigt auf die Basisadresse der Mathtrans-Library. Aber Achtung: Diese Library liegt
nicht im ROM, sondern mull von der Systemdiskette nachgeladen werden. Deshalb wird sie nur bei
Bedarf geöffnet, d. h. sobald eine Funktion daraus aufgenifen wird,
FromWB (Boolean)
Jedes AMIGA-Programm kann im Prinzip auf zw'ei sehr unterschiedliche Arten gestartet werden: Von
der Workbench oder vom CLl. Die Unterschiede liegen zum einen in der Art der Parameterübergabe
(beim CLl-Stan kann eine Zeichenfolge ütergeben werden, beim Benchstart können evtl, andere
Icons aktiviert sein) und zum anderen bei tler Ein-,4Au,sgabe (im ersten Fall steht Ihnen dazu das CLl-
Fenster zur Verfügung, im anderen Fall müssen Sie sich zuerst ein Fenster öffnen - bitte beachten
Sie dazu auch das Demoprogramm “Wli.p”).
Die Variable ‘TromW’ gibt Ihnen nun die Möglit;hkeit, festzustellen, wie Ihr Programm gestartet
wurde. Sie ist (klar) “true” genau dann, wenn der Aufruf von der Workbench erfolgte.
Die MaxonPASCAI.-Fntwncklungsumgebung simuliert übrigens einen CI.I- Start, d. h. wenn Sie Ihr
Programm von don starten, hat FromWB stets den W'ert "false”.
ParameterStr (Str)
Dieser Stringzeiger zeigt auf tlie Zeichenfolge, die, wie oben erw'ähnt, beim CLl-Stan dem Programm
übergeben wurde.
RarameterLen (Integer)
Der Parameterstring endet nicht notwendig mit einem Nullbyte, deshalb enthält diese Variable die
Länge.
StartupMessage (Ptr)
Beim Programmstart von der W’orkbench wird eine Message übergeben, die verschiedene
Informationen enthält. Das Laufzeiesystem von MtixonPASCAL holt diese Nachricht ab und beant-
MaxonPASCAL
146
wortet (ReplyMsg) sie am Ende auch, so daß Sie sich darum nicht zu kümmern brauchen. Sie kön¬
nen sie aber mit Hilfe der Pointervariablen "StartupMessage” auswerten.
Mem (Array [O..MaxLongInt] of Byte absolute 0)
Dieses Feld repräsentiert den byteweise organisierten Hauptspeicher des Rechners. Dadurch sind
einfache Speicherzugriffe möglich.
6.2 Vordefinierte Konstanten
Es gibt folgende vordefinierte Konstanten:
True
False
MaxInt
MaxLong
MaxLongInt
MaxCard
MaxWord
MaxShortCard
MaxByte
MaxShort
MaxShortInt
Pi
logischer Wert “wahr”
iogischer Wert “faisch”
größte Integer-Zahl (32767)
größte Longlnt-Zahi (2147483647)
anderer Name für “MaxLong”
höchste Cardinal-Zahl (65535)
anderer Name für “MaxCard"
größte 8-Bit-Cardinalzahi (255)
anderer Name für “MaxShortCard”
größte 8-Bit-lntegerzahi (127)
anderer Name von “MaxShort”
= 3.14159265358979
7. Prozeduren und Funktionen
147
7. Prozeduren und Funktionen _
MaxonPASC^L beherrscht alle Prozeduren und Funktionen des Standards - außer „Pack“ und
„Unpack“, denn Datenstrukturen werden automatisch gepackt verwaltet. Daneben gibt es aber noch
viele zusätzliche Befehle für alle Bereiche der PASCAI.-Programmierung.
7.1 Ein- und Ausgabe
Write [ (Write-Rarameterliste) ]
Syntax für Write-Parameterliste;
(Dateivariable I Write-Parameter) ( Write-Parameter )
Sw tax für Write-Parameter;
Ausdruck [ ":" Ausdruck [ ":" Ausdruck ] ]
Dies ist die Standard-Ausgabeprozedur. Sie kann prinzipiell ohne Parameterliste verwendet werden -
dann gibt sie nichts aus und ist also überflüssig. Die Parameterliste ist eine geklammerte Liste von
durch Komma getrennten „Write-Parametern“ (siehe Syntax), von denen der erste auch eine
Variable eines Filetyps sein kann. Falls letzteres nicht der Fall ist, so ist „Output“ Default-
Au.sgabedatei.
Ist die Au,sgabedatci vom Typ „Text“, also „FILE OF Chaf, so haben Sie viele verschiedene
Ausgabemöglichkeiten: die nachfolgenden Parameter dürfen von numerischen, booleschen, Char-
und Stringtypen sein, ln jedem Fall darf hinter dem Write-Parameter, mit einem getrennt, die
gewünschte Feldbreite für rechtsbündige Ausgabe stehen.
Fehlt sie, so gibt MaxonPASCAl, grundsätzlich linksbündig aus. Bei der Ausgabe von Real-Werten
darf man auch noch einen zweiten Parameter für das gewünschte Ausgabeformat angeben. Näheres
dazu finden Sie im Abschnitt über Glcitpunkttypen.
W'enn die spezifizierte Ausgabedatei keine Textdatei ist, so müssen alle nachfolgenden Parameter
zum Elementtypen der Datei typkompatibel sein, ln eine Datei des Typs ..FILE OF Real" könnte man
z. B. einen beliebigen numerischen Wert schreiben. Wenn „f eine Dateivariable eines solchen Typs
ist, so wäre
Write (f, X, y)
äquivalent zu;
X ; Put (f) ;
f*:= y , Put (f);
MaxonPASCAI.
148
Näheres ■/.u„Put'' finden Sie ini Kapitel 7.2 „Dateieir“.
WriteLn [ (Write-Rarameterliste) ]
Vi'rite-Parameteriiste: Wie bei„Wr;7e“
Diese Pmzedur ähnelt .,Write'\ ist aber nur bei Textdateien möglidi. Nach Ende der Ausgabe wird
eine neue Zeile angefangen. Hier ist es desofteren siiinvt)ll, die Parameterliste ganz wegzulassen:
Dadurch ward ein Zeilenvorschub in der Standard-Au.sgabe bewirkt.
Read [ (Read-Rarameterliste) ]
Syntax für Read-Parameterliste:
variable { "," Variable }
Die Standard-Eingabeprozedur. Wie bei „Wrile“ kann auch hier die Parameterliste weggelassen wer¬
den, was aber keinen sinnvollen Befehl ergibt. Die Parameterliste, .sofern vorhanden, ist eine Dste
von durch Kommata getrennten Variablen, Analog zu „Write“ darf auch hier der erste Parameter
eine Eile-Variable sein, sonst wird JnpiH" als Default-Eingabekanal benutzt. Auch hier gibt es eine
Unterscheidung zwischen Text- und Nicht-Text-Dateiem
Ist die Eingabedatei vom Typ „Text" (wie z. B. tlie Datei „Input"), so sind als Parameter Variablen
von numerischen, Char- und Stringtypen erlaubt. Es werden dann jeweils Zeichen aus der
Eingabedatei gelesen und in den gewünschten Typen konvertiert.
Bei Nicht-fext-Eingabedateien mü.ssen alle Parameter Variablen sein, die zum Elenienttyp der Datei
typkompatibel sind, insbesondere dieselbe „Breite“ halxtn müs.sen. Hier werden direkt die Daten
und nicht eine lesbare Repräsentation der Daten geic.sen.
Die Dateihandhabung von Standardpascal ist nicht mehr ganz zeitgemäß und mußte bei
•MiixonPASCAL leicht variiert w'erden:
Read(datei,variable)
entspricht deshalb:
Qet (datei) ; Variable:= datei''
und nicht (Wirth: PASCAL Report, Ktip, 11.4.1):
variablejs datei'' ; Get(datei)
Desweiteren wird„Abf'' erst „true“, wenn das Dateiende wirklich erreicht wurde, d. h. eventuell (bei
Textdateien) erst dann, wenn nichts mehr gelesen werden konnte und die Variable dadureb Undefi¬
niert ist. Dies läßt sich in der Regel durch Verwendung von „SeekEoF“ statt „EoF“ vermeiden.
7. Prozeduren und Funktionen
149
ReadLn [ (Read-Parameterliste) ]
Wie Read, aber nur bei Textdateien mdglich,
ReadLn (Parameter)
entspricht
Read(Parameter); ReadLn
und „ReadLn “ entspricht wiederum
While not eoln(datei) do Get(datei)
im Klartext; Alles, was in der Eingabezeile noch hinter dem gelesenen Teil steht, wird iiberlesen.
Page [(datei)]
datei: Variable eines File-typs, Default ist „Output“
Erzeugt Seitenvorschub oder -Wechsel. Heim Bildschirm tedeutet dies Löschen.
ClrScr [ (datei) ]
ebtei: Text-File
Antlerer Name von „Page“ (wurde aus Gründen der Kompatibilität implementiert).
GotoXY (x,y)
X, y; Integer
Setzt den Cursor in Spalte x, Zeile y. Die linke obere Ecke des Ausgabefensters hat die Koordinaten
( 1 , 1 ).
ClrEol
löscht die Zeile ab Cursor.
InsLine
fügt auf dem Bildschirm eine Zeile ein, d. h. der Text unterhalb der Zeile, in der der Cursor steht,
wird nach unten gescrollt.
DelLine
Gegenteil von „MLine“: Die Zeile, in der der Cursor steht, wird gelöscht, alles, was darutiter steht,
um eine Zeile nach oben gescrollt.
MaxonPASCAL
150
EoF [ (datei) ]: Boolean
datei: Variable eines Filetyps, Default ist „input"
Dateiende- und Dateifehler-Funktion. EoF(input) ist übrigens immer „false“.
Eoln [ (datei) ]: Boolean
datei: Variable des Typs „text“, Default ist „input“
Meldet Zeilenende bei Read/ReadLn aus Textdateien.
SeekEoLN [ (datei) ]: Boolean
datei: Textfile-Variable, Default ist „input".
Diese Funktion entspricht dem normalen ..EoLN“, allerdings werden hier Leerzeichen überlesen.
Beispiel:
Var i, j: integer;
Begin
write('Bitte Zahlen eingeben: '); i:=0;
Repeat
read(j); i:=i+j
Until EOLN;
writeln('Summe: ’.i)
End.
Dieses Programm liest von der Standardeingabe eine Zeile voller Zahlen und berechnet die Summe
der Zahlen. Problem: Wenn der Benutzer hinter der letzten Zahl ntK’h ein Leerzeichen eingibt, wird
das Zeilenende nicht erkannt. Das kann behoben werden, indem man „EoLN“ einfach durch
„SeckEoUS“ ersetzt.
SeekEoF [ (datei) ]: Boolean
datei: Textfile-Variable, Default ist „input".
Analog zu „SeekEoLN prüft diese Funktion „EoF", wobei Leerzeichen und Zeilenenden überlesen
werden. Im Gegensatz zum normalen EOF arbeitet „SeekEoF" nur auf Textfiles.
EmptyLN [ (datei) ]: Boolean
datei: Textfile-Variable, Default ist „input“.
Diese Funktion liest eine Zeile aus der Textdatei in den Puffer, überliest führende Leerzeichen und
stellt dann fest, ob die Zeile leer ist.
7. Prozeduren und Funktionen
151
Anwendungsbeispiel: „Read“ wartet teim l^sen von Zahlen stur darauf, daß eine Zahl eingegeben
wird - da hilf kein RETURN-Driieken, Mit der EmptyLN-Funktion können Sie zuvor prüfen, ob der
Benutzer etwas einzugehen gedenkt.
Var i: integer;
Begin
i:=$0815;
writeln('Alter Wert:
writet'Neuen Wert eingeben oder mit RETURN bestätigen: ');
If not EmptyLN Then readln(i);
writelnt'Neuer Wert ist: ',i)
End.
ln dem Moment, wo die Funktion „EmptyLT aufgerufen wird, wartet das Programm darauf, daß der
Benutzer etwas eingibt und RETURN drückt, und es wird geprüft, ob die Eingabe leer ist, d. h. ob er
einfach nur „RETURN“ getippt hat. Die Funktion „EmptyLN“ liest selbst aber noch nichts - abgese¬
hen vttn Leerzeichen, die überlesen werden.
Nur wenn in der eingegebenen Zeile wirklich etwas steht, liest das obige Programm dies mit
„Readln(i)“ ein, andernfalls behält „i“ den alten Wert.
7.2 Dateien
Reset (datei [, name ])
datei: Variable eines FILE-Typs
name: Stringkonstante oder -Variable
Eine Datei wird zum Lesen und Schreiben geöffnet. Dabei kann - als Erweiterung des ISO-Standards
- optional ein Dateiname angegeben werden. Wird er weggelassen, so muß zuvor mit dem „ASSIGN“-
Befehl ein Dateiname zugewiesen worden sein.
Reset in der erweiterten Form (d. h. mit Dateinamen) übernimmt den String nicht in den Puffer, so
daß einerseits keine Längenbeschränkung besteht, andererseits aber keine Stringausdrücke verwen¬
det werden können.
Die Datei muß bereits existieren. Konnte sie nicht geöffnet werden, so wird kein Fehler gemeldet!
Vielmehr gilt dann „Eof(datei)=true“ und „lOResultoO“. Sie müssen den Fehler also selbst
abfangen, bzw. das [.aufzeitsystem meldet bei der nächsten Ein- oder Au.sgabeoperation auf dieser
Datei einen „File not open"-Error.
MaxonPAS(]AL
152
Rewrite (datei [, name ])
datci: Variable eines FlUi-typs
name: Stringkonstante oder -Variable
Eine Datei wird für Sebreibzugriff geöffnet. Nach erfolgreichem „Rewrile“ ist die Datei völlig leer,
und der Lesezeiger steht am Anfang. Dies ist der (wichtige) Unterschied zu „Reset“, wonach man
außer lesen zwar auch schreiben kann, aber dabei lediglich den alten Dateiinhalt überschreibt.
Get (datei)
datei: Variable eines Dateityps
Daten in Pufferdatei ^" lesen.
Put (datei)
datei: Variable eines File-Ttps
Puffer „datei ^ “ in Datei schreiben.
Close (datei)
datei: Variable eines File-Typs
Wenn Sie eine Datei mit „Reset“ oder „Rewrite“ geöffnet halten, müssen Sie sie nach Gebrauch mit
dem „Close“-Befehl wieder schließen. Falls Sie das nicht tun, wird es am Programmendc automa¬
tisch durchgeführt.
Assign (datei, name)
datei: Variable eines FII.E-typs
name: Stringausdruck
Einer Datei wird ein externer Dateiname zugewiesen. Dies ist nötig, ckirnit das Laufzeitsystem beim
an.scbließenden „Reset“ oder „Rewrite“ dieser Datei w'eiß, welche reale Datei angesprochen werden
soll.
Der Dateiname wird in einen zur Filevariablen gehörenden Puffer übernommen, der 30 Bytes lang
ist. Mit dem Nullbyte am Ende kann ein mittels „Assign" zugewiesener Dateiname also maximal 29
Zeichen iang sein. Falls das nicht reicht, gibt es alternativ die erweiterten Versionen von „Reset“ und
„Rewrile“ (s. u,), die ohne vorheriges „Assign“ auskommen,
7. Prozeduren und Funktionen
153
lOResult: integer
Nach jeder Ein- und Ausgaheoperation von MaxonPASCAL, also z. B. „Reset", „Rewrite“, „Read",
Jeek“ usw. wird diese Funktion mit der vom Betriebsysiem gelieferten Fehlernummer initialisiert,
also „0“, wenn alles klar ist, und einen Wert „>0“, wenn ein Fehler auftrat.
Var f: text;
Begin reset(f,’yxlegrümpf'); writelntlOResult) End.
liefert, falls nicht zufällig eine Datei ntimens „yxiegrtimpf existiert, die Fehlernummer 205; „Object
not found".
Filehandle (datei): Longlnt
datei: Dateivariable
Diese Funktion liefert zu einer PASCAI.-Dateivariablen die zugehörige Dateihandle, so daß Sie auf
die Datei auch mit den Befehlen tler Dos.libraiy arbeiten können. Beispiel:
{$path "Pascal:include/"; incl"libraries/dos.h" }
Var f: text;
e: integer;
c: Char;
Begin
resettf, •CON:0/0/640/200/Kein CLI');
If IOResult=0 Then exit;
e:= Execute('dir'$a’endcli',
filehandle(f),
filehandle(f));
{ Fenster öffnen }
{ Fehler abfangenl
{ Befehlsfolge }
{ Eingabedatei )
{ Ausgabedatei }
writelntf);
writelntf,'Fehlercode war:',e);
writelntf, 'RETURN drüctcenl ' ) ;
readlnt f,c);
close(f)
End.
)
Dieses Programm öffnet mit „Reset" ein Fenster und läßt darin vom DOS die Befehle „Dir" und
„EndCU" ausführen (letzterer ist wichtig, .sonst hängt das DOS sich auf!). Die Befehle müssen durch
das Zeichen #Ja, also ein „Lmefeed", getrennt werden.
Beachten Sie bitte; - „Filehandle“ prüft nicht, oh die Datei auch wirklich geöffnet wurde. Falls dies
nicht der Fall sein sollte, ist das Ergebnis imdcfiniei't.
I®' Wenn das Programm aus tlem P.ASCAl.-System oder von der Workbench gestartet wird, sind
„Filehandle(input)“ und „Filehandle(output)“ undeliniert. Wenn der Programmstart vom (iD
erfolgte, liefern die beiden Ausdrücke die Handle der Standardein- bzw. Ausgabedatei,
MaxonPASCAL
154
‘S’ Mit DOS-Aufrufen können Sie die interne Dateiliandhalwng des PASCAL durcheinanderbrin¬
gen. Generell sind JioF', „EoLN“, „FilePos“ und „PüeSize“ einer Datei nach einem derartigen
Aufruf Undefiniert.
„DosClose(FUehandle(...))“ ist absolut tabu - Gurugefahr!
Seek (datei, position)
datei: File-Variable
Position: Gany-zahliger Ausdruck
Setzt den Schreib-/Lesezeiger einer zuvor mit „Reset" geöffneten Datei auf eine bestimmte Position.
Die erste Position bat die Nummer 0.
Eine „Position" ist ein Element des Datei-Grundtyps, bei „Text“ also ein Char ( = 1 Bv-te), bei „File of
integer“ ein 2-Byte-Wort usw.
Nach „Seekffi“ ist die Pufferv-ariable „f^“ noch nicht initialisiert. Es muß also (wenn's unbedingt
sein muß) noch „Get(l)“ autgerufen werden.
Filepos (datei): Longint
datei: File-Variable
Gibt die Position des Schreib-ZLesezeigers in einer zuvor mit „Reset" geöffneten Datei an. Nach
„Seek(datei,n)“ liefert „Filepos(datei)“ beispielsweise den Wen n, vorausgesetzt, die Datei ist ent¬
sprechend lang.
FUesize (datei): Longint
datei: File-Variable
Liefert die Größe einer zuvor mit „Reset" oder „Rewrite" geöffneten Datei. Im allgemeinen wird die
Größe aber nicht in Btnes oder Blöcken angegeben, sondern in Elementen des Datei-Grundtyps, so
daß diese Funktion ohne Umformung 7.\\„Seek" mA „FilePos“ kompatibel ist. Beispiel:
Var f: Text;
Begin
roset (f, '8:startup-sequence');
seek (f, filesizetf));
writeln (f, 'echo "Hallol"');
dose (£)
End.
Dieses Programm öffnet die Startup-sequence, setzt den Zeiger auf das Dateiende und hängt dort
mittels „writeln“ einen CU-Befehl an.
7. Prozeduren und Funktionen
153
Buffer (datei, groesse)
datei; Variable eines beliebigen FILE-Typs
groesse: gewünschte PiiffergrölSe in Bytes
Die Dateizugriffe eines Programms erfolgen intern über die DOS-Dbrary des Betriebssystems, die
das Filesystem benutzt, welches wiederum über Devices (Gerätetreiber) auf die Hardware zugreift.
Wir haben es also mit einem ziemlichen Aufwand zu tun, der jedesmal getrieben wird, bevor auch
nur ein einziges Byte gelesen oder geschrieben werden kann.
Schlimmer noch: Dieser Überbau muß bei jeder einzelnen Dateioperation erledigt werden und ist
vom Umfang der anschließend zu übertragenen Daten unabhängig. Sie können sich denken (oder
mußten es bereits erfahren), was dann bei Textdateien, bei denen ja zeichenweise gelesen und
geschrieben werden muß, passiert: Für jedes übenragene Byte muß die gesamte Maschinerie in
Gang gesetzt werden. Selbst die wohl kaum als überragend schnell zu bezeichnenden MIIGA-
Diskettenlaufwerke sind dann so schnell, daß die eigentlichen Diskettenzugriffe verglichen mit der
enormen Zeitverschwendung durch das Betriebssystem kaum noch Zeit brauchen. Vielleicht ken¬
nen Sie noch das IFF-Ladeprogramm, das bei KICKPASCAI. 1.0 als Beispielprogramm beilag: Es war
scheußlich langsam, aber nicht etwa, weil KICKPASCAL so schlechten Code erzeugt hätte, sondern
weil die Bilddaten im wesentlichen byteweise gelesen worden mußten.
Viel effektiver wäre es doch, für eine Datei einen großen Puffer im IIVM einzurichten. Bei
Schreiboperationen könnte man die Daten erst einmal in diesem Puffer ablegen und dann in einem
Rutsch (und mit einem einzigen DOS-Aufruf) schreiben, .sobald der Puffer voll ist.
Umgekehrt könnte man bei Leseoperationen zuerst einen großen Datenblock in den Puffer lesen
und dann von don ohne weitere DOS-Benutzung die Daten weiterverarbeiten.
|aaa, werden Sie jetzt vielleicht sagen, das klingt zwar alles recht sinnvoll und einleuchtend, aber die
Verwaltung eines solchen Pufferspeichers bedeutet doch einen hohen Programmieraufwand...?
Keine Panik - MaxonP.ASCAL kann mit der Vmieduv „Buffer“ solche Speicher vollautomatisch (und
für Ihr übriges Programm unsichtbar) verwalten. Die Prozedur benötigt nur zwei Parameter: zum
einen eine Dateivariable, die zuvor mit „Resel“ oder „Rewrile“ geöffnet worden sein muß, und zum
anderen die gewünschte Puffergröße in Bytes. Hier bringen w'enige kBytes schon eine deutliche
Geschwindigkeitserhöhung; über 10000 Bytes zu gehen, ist in der Regel nicht sinnvoll. Das
Programm läuft dann ganz genau wie zuvor, nur daß eben die Dateioperationen beschleunigt wer¬
den.
Dazu noch ein paar Hinweise:
IS’ Wurde die Datei mit „Reset“ geöffnet, wird der Puffer nur für Leseoiaerationen benutzt und bei
jedem „'Write“ geleert.
cä- Nach „Seek“ wird der Lesepuffer automatisch entleert. Deshalb kann es passieren, daß ein
Programm sogar verlangsamt wird, wenn es in einer Datei dauernd hin und her springt.
MaxonPASCAI.
156
w Zwisdien Öffnen und Schließen einer Datei kann die Puffergröße für diese Datei höchstens ein¬
mal festgelegt werden. Weitere Aufmfe von „Buffer'’ werden ignoriert.
BlockRead (datei, variable, anzahl)
datei: zum Lesen geöffnete Dateivariable
variable: beliebige Variable, in die Daten gelesen werden sollen
anzahl: Anzahl der zu lesenden Datenblöcke
Oft ist der Inhalt einer Datei nicht so strukturiert, daß man sie sinnvoll als ,.FILE OF <Tvp>" dekla¬
rieren konnte. Man denke nur an die diversen IFF-Formate, die aus unterschiedlich aufgebauten
Hunks verschiedenster länge bestehen. Deshalb gibt es die Prozedur „BlockRead“, die aus einer
beliebigen Datei Daten beliebiger Art und Länge in eine beliebige Variable liest. ..anzahl“ ist dabei
die .Anzabl ticr Datenblöcke, die jeweils dem Eletnenttyp der Datei entsprechen, ist sie als „FILE OF
Typ“ deklariert, so werden anzahl * SizeOffTyp) Bytes gelesen. Bei einer Textdatei entspräche ein
Datenblock also einem einzelnen Zeichen, bei typfreien Dateien wird als Datetisatztyp „Byte“ ange-
notntnen.
VAR t: Text;
s: String[1000];
BEGIN
Reset (t, '8:Startup-Sequence');
If FileSize (t) >= 1000 Then
Error ('Datei ist zu langt');
BloclcRead {t, s, FileSize (t));
B [FileSize (t) * 1]:= chr(O); [ Stringende markieren }
Writelnts)
END.
Das Programm liest die komplette Startup-Sequence in eine Stringvariable und gibt sie aus.
BlockWrite (datei, variable, anzahl)
datei: zum Lesen geöffnete Dateivariable
variable: beliebige Variable, in tlie Daten gelesen werden sollen
atizahl: Anzahl der zu lesenden Datenblncke
Atialog zu „BlockRead“ schreibt „BlockWrile“ Daten aus einer Variablen beliebigen Typs in eine
Datei.
7. Prozeduren und Funktionen
157
7.3 Arithmetische und andere Funktionen
Alle in ilieseni Abschnitt vorgestellten Funktionen sind Bestandteil des Jensen-Wirth-Standards.
Einige von ihnen mtißten natürlich fiir die zusätzlichen Datentypen von MaxonPASCAL enveitert
werden. Sie sind in alphabetischer Reihenfolge aufgeführt.
Abs(num): Numerisch
num: Real- oder Ganzzahlaustlruck
Betrag von Gleitpunkt- oder Ganzzahldaten. Das Ergebnis ist stets vom selben Typ wie der
Parameter.
ArcTan(x): Real
X: Real-Ausdruck
Arcustangens-Funktion. Wie die meisten Real-Funktionen, wird auch diese der Mathtrans.library ent¬
nommen, w'elche hei Bedarf geöffnet wird. Die l.ihraiy liegt aber nicht im ROM, sondern mulä vom
.,libs:"- Verzeichnis der Sv-stemdiskette geladen werden. Ist diese nicht vorhanden, wird ein Fehler
gemeldet.
Chr(i); Char
i: Integer-Ausdruck, Bereich Ü..255
Liefert das Zeichen mit dem Ascii-Code i. Umkehrfunktion ist „ord(c)“.
Cos(x): Real
X: Real-Ausdruck
Die wohlbekannte Cosinus-Funktion. Bei dieser und allen anderen trigonometrischen Funktionen
müssen die Winkel - wie in der Mathematik üblich - im Bogenmaß angegeben werden. Aus einem
Gradwinkel erhält man die zugehörige Bogenmatszalil, indem man durch 180 teilt und mit Pi multi¬
pliziert - die andere Richtung geht entsprechend genau andersrum.
Exp(x): Real
X: Real-Ausdruck
Dies ist die Exponentialfunktion zur Basis e (Euler'sche Zahl). Die zugehörige Umkehrfunktion ist
„bl“.
MaxonPASCAL
158
Lq(x): Real
X: Real-Ausdruck, x>ü
Ergibt den natürlichen Logarithmus von x.
Odd(i); Boolean
i: Ganzzahl-Ausdruck
Odd(i) ist „true“ genau dann, wenn i ungerade ist.
Ord(o): Integer oder anderer Ganizahltyp
0 : Ausdruck eines geordneten Typs (Ganzzahl, Boolean, Char, Aufeählungstyp)
Liefert die Ordnungszahl des Ausdrucks in den Klammern, Ist dieser Au,sdruck von einem
Ganzzahltyp, ist das Ergebnis vom sellxtn Typ und auch vom selben Wert (so daß die Funktion hier
unsinnig ist). .Andernfalls ist das Ergebnis vom Typ „Integer".
Pred(o): ordinal
ü; Wie bei „Ord(o)“
Die Vorgänger-Funktion, Das Ergebnis ist stets vom selben Typ wie der Parameter und ist der Wert,
dessen Ordnungszahl um 1 kleiner ist als der des Parameters. Beispiel:
Pred(26731)=26730, Pred('Y*)=‘X•, Fred(true)=£alse.
Pred(false) oder Pred(chr(0)) sind eigentlich Undefiniert, es kommt aber zu keiner Fehlermeldung.
Round(x): Longint
x: Real-Ausdruck, abs(x) < = Max].onglnt
Gerundeter Wert von x.
Sm(x): Real
X: Real-Ausdruck
Die beliebte Sinus-Funktion. Natürlich betrachtet auch sie den Parameter als Winkel im Bogenmaß
(vgl. „Co,s(x)“).
Sqr(nuni): numerisch
num: Numerischer Ausdruck
Berechnet das Quadrat des Parameters. Das Ergebnis ist stets vom .selben Typ wie der Parameter.
7, Prozeduren und Funktionen
159
Sqrt(x): Real
X: Real-Ausdruck, x > = 0
Berechnet tlie Quadratwurzel des Parameters
Succ(o): ordinal
0 : wie bei „ord(o)'' und „Pred(o)“
Diese Funktion ist das Gegenstück zu „Pred“, d.h. sie liefert den Nachfolger eines Ausdrucks eines
geordencten Datentc'ps.
Trunc(x): Longint
x: Real-Ausdruck, abs(x) < = MaxLonglnt
Liefert den Ganzzahl-Anteil'von „x“. Im Gegensatz zu „Round“ wird hier nicht gerundet; vielmehr
werden die Nachkommastellen einfach weggelassen.
7.4 Pointer
New(point)
point: Variable eines Pointenyps
Speiclierplatz für eine dtmamische Variable reservieren und „point“ darauf .setzen.
Bei Records mit Variantenteil wird immer die maximale Größe reservien. Die Version
.,New(point,feldl,feld2,...)“ ist nicht implementieit.
Dispose( point)
point: Variable eines PointerU'ps
Dynamische Variable löschen, Speicher freigeben.
DisposeAU
Alle dynamischen Variablen tintl alle von AllocMern resenaerten Speicherbereiche werden freigege-
hen. Dies ist keine Standard-PASCAL- Prozedur.
MaxonPASCAL
160
7.5 AMIGA-Spezifisches
Alloc Mem (len, cond): Longint
len (l/)nglnt): gewünschte Größe in Bytes
cond (Longint): Bedingungen
Diese Funktion entspricht im Prinzip der Exec-Funktion „AllocMem“.
Der AMJGA ist - wie Ihnen wohl kaum entgangen sein dürfte - multitaskingfiihig, d.h. mehrere
Programme können gleichzeitig laufen.
Dtts führt natürlich dazu, daß ein Programm nicht so ohne weiteres auf den Speicher zugreifen
kann, denn es besteht ja immer die Gefahr, daß sich dabei zw'ei Programme ins Gebege kommen.
■■Mso muß sich ein Programm bei Bedarf vom Betriebssystem Speicher reservieren lassen. Genau das
tut nun .\llocMem bzw. ^\lloc_Mem. Dabei ist ,,Len“ die gewünschte Größe des Speichers.
Bei „Cond" können Sie bestimmte Bedingungen angeben. Fdne 2 (genannt ME.MF_CHIP) bewirkt z.
B., daß der Speicher im sog. Chipmemon' liegt, bei ÜIOOÜO (MEMF_CI.EAR) wird der Speicher auto¬
matisch gelöscht (mit Nullen gefüllt). Wenn Sie keine besonderen Ansprüche stellen, geben Sie ein¬
fach cond=0 an.
Das Ergebnis der Funktion ist die Anfangsadresse des soeben reservierten Speichers. Was unter¬
scheidet nun diese MaxnnPASCAI.-Funktinn von der fast gleichlautenden Exec-Betriebssystem-
Funkticm?
Zum einen steigt Alloc_Mem mit einer Feblermcitlung aus, wenn kein Speicher reserviert werden
konnte (z.B. w'eil schon alles belegt war). Zum anderen führt das Laufzeitsystem von MaxonPASCAI.
über die AIIoc_.Mem-Funktion quasi Buch, so daß alle reservierten Speicherbereiche am
Programmende automatisch wieder freigegeben werden. Das können Sie aber auch „manuell“
machen: Der entsprechende Befehl heißt Free_Mem.
Open Window (X, Y, W, H, Farbe, IDCMP, Flags, Name, Screen, MinW,
MinH, MaxW, MaxH): Ptr
X (Integer):
Y (Integer):
W (Cardinal):
H (Cardinal):
Farbe (Cardinal):
IDCMP (Long):
Flags (Long):
Name (Str):
Screen (Ptr):
MinW, MinH (Cardinal):
x-Koordinate der Fensterposition
y-Koordinate der Position
Breite („Width“)
flöhe („Height“)
Lo-Byte ist Hinter-, Hi-Byle Vordergrundfarbe
Signal-Bit-Maske
z.B. IIOQO für ACnVATE, 8 fürWINDOWCLOSE
Fenstertitei
Zeiger auf Screen, „Nil“ für Workbeneh,screen
Mindestbreite und -hohe
7. Prozeduren und Funktionen
161
MaxW, MaxH (Cardinal): Maximalbrcite und -höhe
Erraten: Open_Window ölTnet ein Fenster. Wieder entsprechen die einzelnen Parameter den
Feldern der NewWindow-Struktur, wie zuvor bricht das biufzeitsystem ab, falls das Fenster nicht
geöffnet werden konnte, und abermals werden die Fenster am Programmende automatisch
geschlossen,
„FirstGadget“, „Checkmark“ und „BitMap“ werden jeweils auf Nil gesetzt, „t>'pe“ je nach Sachlage auf
1 oder 15.
Close_Window (p)
p: Ptr
Dies ist das Gegenteil mn „Open_Window‘': ein Fenster ward geschlossen.
Free_Mera (Adr,Len)
Adr (Longlnt): Speicheradresse
Len (Longlnt): Länge in Bytes
Dies ist das Gegenstück zu AllocJ/km-, ein reservierter Speicherbereich wird wieder freigegeben.
Open_Screen(X, Y ,W, H, Depth, BackPen, DetailPen, \^ewmodes,
Name): Ptr
X (Integer): x-Koordinate der Position
Y (Integer): y-Koordinate der Position
W (Cardinal): Breite („Width“) des Screens
H (Cardinal): Höhe („Height“)
Depth (Integer): Anzahl der Bit[)lanes („Tiefe“)
BackPen (Bv'te): Hintergrundfarhe
DetailPen (Byte): Vordergrimdfaiite
ViewModes (Wörd): Flags (z.B. 4 für Inteiiace, I8ÜÜ0 für Hires)
Name (str): Titel
Diese Funktion eröffnet einen Screen, Die einzelnen Parameter sind identisch mit den entsprechen¬
den Feldern in der NewScreen-Struktur.
Als „Type“ wird .stets 15 (Custom-screen) angenommen, „TcxtAttr“, „Gadgets" und „CustomBitMap“
werden auf Nil gesetzt. Konnte der Screen nicht geöffnet werden, bricht das Programm mit einer
Fehleirneldung ab. MaxonPASC.AL „merkt“ sich, welche Screens mit dieser Funktion geöffnet wer¬
den, und schließt sie ggf. am Programmende wieder automatisch.
MaxonPASCAL
162
CloseScreen (p)
p: Ptr
Dreimal dürfen Sie raten... Richtig! Screen schließen!
OpenConsole (p): Ptr
p (Ptr): Windowhandle
Diese Funktion eröffnet zu einem Window das Console.devicc. Zurück- gegeben wird eine ■'Ut
Devicehandle. Dieser Pointer zeigt (abgesehen vom Offset 16 bzw. 64) auf den Read- bzw.
Writerephport.
ReadCon (p): Char
p (Ptr): ConsoleHatidle (wird von „OpenConsole“ zurückgegeben)
Liest vom Console.device ein Zeichen. Wurde kein Zeichen eingegeben, ist das Ergebnis cbr(O).
Beachten Sie aber bitte, daß viele Tasten des AMIGA-Keyboards eine ganze Folge von Zeichen lie¬
fern, die Sie dann nacheinander lesen müssen.
WriteCon (p,String)
p (ptr): Consolehandle
String (str): Zeichenkette
Das Console-device „p“ (erinnern Sie .sich noch? Diesen Zeiger erhalten Sie von der OpenConsole-
Funktion) wird beauftragt, eine Zeichenfolge im zugehörigen Window auszugeben.
CloseConsole (p)
p: Ptr
Diese Prozedur schließt ein Console-Device, das mit „OpenConsole“ geöffnet worden war.
SetStdIO (p)
p: Ptr
Die Standard-Ein-/Ausgabe wird auf das Console-Device mit der Handle „p“ umgeleitet. Dadurch
können Sie auf ein mit „Open_Window“ geöffnetes Fenster mit den normalen E/A-Prozeduren
(Read, Write, ClrScr...) zugreifen.
SetStdlO(NU)
Aktiviert wieder die normale Standard-E/A.
7. Prozeduren und Funktionen
163
Im Handbuch zu KickPascal 1.0 wurde empfohlen, beim Programmstart von der Workbench mittels
Resettlnput, 'CON:...'); Output:» Input;
Kanäle für die Standard-E/A zu definieren. Dies ist bei Version 3.0 aus Kompatibilitätsgründen wei¬
terhin möglich. Es ist aber „sauberer“, obige Befehlsfolge durch
Win:= Open_Window (...);
Con:= OpenConsole (Win);
SetStdIO (Con)
ZU ersetzen.
OpenLib (var,name,version)
var; Pointer-Variable
name (Str): Name der Librar>'
Version (Longlnt): Versionsnummer
Diese Prozedur entspricht der Exec-Funktion „OpenLihrary". Die Unterschiede;
na- Der Befehl ist nicht als Funktion, .sondern als Prozedur realisiert. Die Basisadresse der Library
wird dann mittels VAR-Parmeter zurückgegeben.
Kann die Library nicht geöffnet werden, wird mit einer entsprechenden Fehlermeldung abge-
brcKhen.
«ar \Xdc inzwischen schon fast gew'ohnt, wird die Bibliothek am Ende ordnungsgemälä wieder
geschlossen.
CloseLib(p)
p (Ptr): Zeiger auf Libraiy'
W Eigentlich ist dieser Befehl überflüssig, denn, wie oben erwähnt, werden Libran's automatisch
geschlossen. Trotzdem wurde er der Vollständigkeit halber implementiert.
Wait_Port(p); Ptr
p (Ptr); Zeiger auf Message-Port
Entspricht der Exec-Funktion „WaitPort".
Wait(Mask): long
Mask (Ixinglnt): Signalmaske
Ist absolut identisch mit der gleichnamigen Fatec-Funktion.
MaxonPASCAL
164
Get_Msg(p): Ptr
p (ptr): Zeiger auf Message-Port
Ist identisch mit der Exec-Funktion „GetMsg“.
Reply_Msg(p)
p(Ptr): Zeiger auf Message
Identisch mit der Exec-Funktion „ReplyMsg“.
7.6 Nützliche MaxonPASCAL-Spezialitäten
Break (mask); integer
mask: Bitmaske mit 4 Bits: Bit
Wert
Bedeutung
0
1
CtrI-C
1
2
CtrI-D
2
4
CtrI-E
3
8
CtrI-F
MaxonP.ASCAL bietet Ihnen die Möglichkeit, Programme
mit der Taste FlO abzubrcchen. Das ist
aber nicht sehr sauber: Das Laufeeitsystem fragt hier, um nicht mehr Zeit, als unbedingt nötig zu
verlieren, direkt die Tastatur ab.Deshalb wird überhaupt nicht getestet, in welchem Fenster die
Faste gedrückt wurde, so dai^ man damit eventuell mehrere Tasks gleichzeitig unterbricht. Aus die¬
sem Grund ist diese Möglichkeit eher als Paniktaste während der Programmentwicklung gedacht -
einem Anw'ender sollten Sie ein solches Programm nicht zumuten.
Langer Rede schwacher Sinn: Mit der Funktion „Break“ können Sie die Tastenkombinatinnen C
und ^ D abtragen (und auch noch ^ E und F - alaer es ist nicht üblich, diese Tasten zu benut¬
zen). Die Function „Break“ gibt „true" zurück, wenn eine der in der Bitmaske enthaltenen Taste
gedrückt wurde, An geeigneten Stellen Ihres Programms sollten Sie die C-Taste abfragen („IF bre-
ak(l) TUEN...“) und dann kontrolliert (geöffnete Dateien scbließen, reservierten Speicher freige¬
ben...) das Programm beenden. Spätestens wenn Sie eine lauffähige Objektdatei abspeichern, soll-
teti Sic die „Unterbrechen“- Option des Compilers au.sschalten.
7. Prozeduren und Funktionen
165
CBreak
Testet, ob die T'astenkoinbination <Ctrl> + <C> gedrückt wurde, und bricht in diesem Fall mit
der Meldung „BREAK" ab. Es entspiicht damit der Anweisung „ IF break(l) TUEN error('BREAK’) „
und kann immer dann verwendet werden, wenn ein unkontrolliertes Abbrechen des Programms
nicht schadet.
Nähere Erläuterungen zum Sinn tiieses Befehls finden Sie bei der Beschreibung der Function
„Break(n)‘'.
FreeStack; Longint
Gibt an, wie viele Bytes noch auf dem Stack frei sind. Man kann die.se Funktion in rekursiven
Programmen verwentlen, um selbst Stacküberlätife abzufangen, sobald der Platz knapp w'ird.
Ein anderes Beispiel; Ein Programm mit großen Datenmengen.
Program Monstrum;
Procedure Main; { das eigentliche Hauptprograinin }
Var a: Array[1..100000] o£ Real;
{ benötigt 4*100000 Bytes }
Begin
{ hier steht das Programm }
End;
Begin
If FreeStack<410000 Then { 400 KB für Array, 10 KB Reserve }
Writelnt'Zu wenig Stack, Babel')
Else
Main
End.
Das Programm benötigt ein 400 KByte großes Array. Um eine luufzeit- Fehlermeldung zu vermei-
tlen, |trüft das Hauptprogramm, ob genug Stack zur Verfügung stellt. Nur falls dem so ist, wird die
Prozetlur „Main“ aufgerufen, in der das Riesenarray lokal deklariert ist.
Random: Real
Eiefert eine Zufallszahl mit 0 <= Random < 1. Der Zufallszahlengenerator tenutzt ein
Standardverfahren; zusätzJicIi wird aber auch die momentane Rasterposititin des Bildschimi-
Elekronenstrahls in die Redimmg aufgenommen, so daß die Folge richtig schön chaotisch wird.
MaxonPASCAL
166
Random (n): Integer
n: Integer
Liefert eine ganzzahlige Zufallszahl im Bereich von 0 bis n-1.
Randomize
Die Zufallszahlenfolge wird mit der momentanen Systemzeit initialisien. Da in die Berechnung der
Zufellszahlen sowieso ein nicht-mathematisches Element eingeht (s. o.), ist diese Prozedur bedeu¬
tungslos und wurde nur aus Kompatibilitätsgründen implementiert.
Hi (int): Integer
int; Integer
„Hi-Byte“ einer Zahl: entspricht
Word(int) div 256
(da hier vorzeichenlos gerechnet wird), ist aber schneller.
Lo (int): Integer
int; Integer
„Lo-Byte“: Niederwertiges Byte, genau wie „int AND $ff‘
Upcase (c): Char
c: Char
Wandelt den Buchstaben „c“, falls er zu den Kleinbuchstaben gehört, in einen Großbuchstaben.
Natürlich werden auch Umlaute korrekt gewandelt. Beispiel:
Var s: String;
i: integer;
Begln
a!='0 zerfretteiter Grunzwanzlingl';
For ii=l to Length(s) do write(Upcaee(s[i]))
End.
Ergebnis:
O ZERFRETTELTER QRUNZWANZLINO1
Swap (int): Integer
int: Integer
Vertauscht Hi- und Lo-Byte des Parameters.
7. PrQ 7 x;duren und Funktionen
167
Frac (r): Real
n Real-Zahl
Diese Funktion liefert die Nachkommastellen einer Real-Z^hl.
Beispiel:
Frac (17.4) = 0.4
Frac(-0.07) = -0.07
Frac(le+10) = 0 (außerhalb der Rechengenauigkeit)
Es gilt: X = Trunefx) -I- Frac(x) , felis x eine Realzahl ist, die im „Longlnf'-Bereich liegt, so daß
„Trunc" den richtigen Wert liefert.
Addr (x): LoDglat
x: Beliebige Variable, Prozedur oder Funktion
Gibt die Speicheradresse, an der die Variable liegt b^. die Prozedur oder Funktion „x“ beginnt,
zurück.
Die Funktion
Addr(var)
(„var“ = beliebige Variable) entspricht damit
Long (* var ) (siehe auch Kapitel „Pointer“).
PwrlO(i): Real
i: Integer-Ausdruck, -19 < i < 19
Diese Funktion liefert die Zehnerpotenz einer ganzen Zahl als Real. Man könnte dies auch ohne wei¬
teres durch wiederholtes Multiplizieren erreichen, aber „pwrlO“ holt sich die Werte aus einer
Wertetabelle und ist damit erstens schneller und zweitens vermeidet man die Fortpflanzung von
Rundungsfehlern.
DbPwrlO(i): Double
i: Integer-Ausdruck, -308 < i < +308
Dies ist die Entsprechung zu „PwrlO" im Double-Bereich - daher auch das „Db“ am Anfang.
MaxonPASCAL
168
Si2e0f(x): Long
x: Typbezeichner oder beliebige Variable
Liefen den Speicherbedarf eines Datentyps bzw. einer Variablen:
SizeOf(Integer) = 2
SizeOf(DosBaae) = 4 ("Dosbaae" lat eine Variable dea Typa
"Ptr", aiehe auch Kapitel IV).
Delay(n)
n: Iniegerzahl
Delay macht - genau wie die gleichnamige DOS-Funktion - eine Pause von n 50stel Sekunden.
EiTor(string)
String: Str
Das Programm steigt mit der angegebenen Fehler- (oder sonstiger) Meldung aus.
Halt (nummer)
nummer: integer
Programmabbruch mit der angegebenen Fehlernummer.
AddExitServer (proc)
proc: globale Prozedur ohne Parameterliste
In einem Multitasking-System wie dem AMIGA Lst es oft wichtig, dal,'S Programme nicht unkontrol¬
liert abbrechen, sondern zuerst noch irgendwie „aufräumen“, z. B. Dateien schließen, Speicher frei¬
geben usw. Hat man über MaxonPASCAl.-Prüzeduren auf derartige Resourcen zugegriffen (z. B.
„0[)m_y(indow , „Reset", „Allocjneni“...), werden die entsprechenden Schließ- cxler
Freigabeprozeduren am Programmende automatisch ausgeführt. Wenn man aber
Betriebssystemfunktionen direkt aufgerufen, z, B. „MocBümap" (aus der graphics.libraryO eine
Bitmap reserviert hat, muß man selbst für ein ordentliches Programmende sorgen.
Natürlich kann man die entsprechenden Anweisungen einfach am Ende des Ilauptprogramms auf-
rufen. Dann werden sie aber nur bei einem normalen Programmende ausgeführt, nicht beim
•Abbruch mit einer Fehlermeldung.
Nun stelle man sich folgendes Szenario vor: ein Programm reserviert sich mittels „AllocBümap“ etli¬
che große Bitmaps. Anschließend versucht es ncxth, mittels der MaxonPASCAL-Funktion
„Openjcreen" einen Screen zu öffnen, beispielsweise in der Absicht, auf den (unsichtbaren)
Bitplanes Bildei eüier animierten Grafik zu berechnen und sie dann auf den (sichtbaren) Screen zu
blittcrn. Nun sei das Chip-RAM durch die „AllocBifmap“-k\iin.\k aber schon so voll, daß kein Screen
7. Prozeduren und Funktionen
169
mehr geöfliiet werden kann - das Programm steigt mit der Meldung „Intuition error aus, ohne die
Bitmajis wieder freizugeben. Ergebnis: das Chii>RAM ist fast voll belegt und kann nur mit einem
Reset des Systems wieder freigegeben werden.
Hier hilft die Piaiedur „AddHxilServer“: Mit ihr kann man Prozeduren angeben, die beim wie auch
immer gearteten Ende eines Programms ausgeführt werden sollen. Durch wiederholten Aufruf von
MidExilServer“ können beliebig viele solcher Exit-Prozeduren gewählt werden, die dann am
Programmende in umgekehrter Reihenfolge ausgeführt werden. Die Prozeduren müssen global
(also nicht lokal innerhalb einer anderen Prozedur oder Funktion definiert) sein und dürfen keine
Parameter besitzen.
PROGRAM Exitus;
PROCEDURE Ausstieg;
BEGIN
Writeln('ExitServer ausgeführt.')
END;
BEGIN
AddExitServer(Ausstieg);
Writelnt'Division durch 0: 1/0);
Writelnt'Diese Zeile wird nie ausgegeben.')
END.
Das Programm eraeugt folgende Ausgabe:
Division durch 0: <- "normale" Ausgabe des Programms
Division by zero. <- Fehlermeldung des Laufzeitsystems
ExitServer ausgeführt. <- Ausgabe des ExitServers
Bei jedem Aufruf der Funktionen „OpmJVimkMH“, „üpenjereen“ und „OpenCatisole“ und
„Openüh“ installiert das PASCAL-üiufzeitsystem im Prinzip nichts anderes als eine Exitseo'er-
Prozedur, die die jeweilige Resource schließt. Wenn Sie also in Ihrem Programm zuerst einen
Exitsen'cr installieren und dann ein Window offnen, wird am Ende des Programms erst (Aufruf der
ExitServer in umgekehi ter Reihenfolge!) ilas Fenster geschlossen und dann erst Ihre Exit-Prozedur
aufgerufen, Sie können dann z. B. keine Ausgaben in das Fenster mehr machen.
Mit „New“ oder „Mlocjlem“ re.servierter Speicher wird dagegen erst nach der Abarbeitung aller
ExitServer freigegeben (falls nicht schon geschehen), und noch geöffnete Dateien werden erst dann
geschlossen.
Exil
Diese Prozedur verläl^t den aktuellen Block. Wenn EXIT im Hauptprogramm aufgerufen wird, ent¬
spricht es einem GÜTO-Spnmg ans Programmende, in einer Prozetiur oder Funktion entsprechend
einem Sprung an deren Ende.
MaxonPASCAL
170
Beispiel:
PROGRAM Nanu;
PROCEDURE p;
BEGIN
Writeln('PI');
Exlt;
Wrlteln('P2■)
END;
BEGIN
Wrlteln(•Start');
PI
Writeln('Mitte');
Exlt;
Writeln('Ende.■)
END.
Das Programm erzeugt die Ausgabe:
Start
PI
Mitte
Exchange (varl, var2)
varl,var2: Variablen
Vertauscht den Inhalt zweier Variablen. Die Variablen müssen skalar sein, d.h. numerisch, Bool,
Char, Aufzählungs- und Pointertypen.
Ferner müssen die Typen der Variablen kompatibel sein, insbesondere dieselbe Länge haben.
Beispiel:
Var a, b: integer;
Begln
a:=26731; b:=4711;
Exchange(a,b);
'write(a:8, b!8)
End.
gibt aus:
4711 26731
Inc (v)
v: Variable eines geordneten Typs (z. B. Ganzzahl, Char...)
Der Wert der Variablen „v“ wird um 1 erhöht. Die Anweisung entspricht damit
v:= Suco(v),
7. Prozeduren und Funktionen
171
Allerdings findet bei „Inc" keine Prüfung auf arithmetischen Überlauf oder Bereichsüberschreitung
statt.
Beispiele:
{ Variablendeklaration: VAR o: Char; i: integer; b: Byte )
c:= 'X'; Inc(c); Write(c) gibt aue: Y
i:= 7 ; inc(i); Write(i) gibt aus: 8
b:= 255; Inc(b); Write(b) gibt aus: 0 (Überlauf!)
Dec (v)
V: Variable eines geordneten Typs (z. B. Ganzzahl, Char,..)
Dies ist das genaue Geggenteil von ,,lnc": die Variable wird, ohne Bereichsunterschreitung oder
Unterlauf abzufangen, um einen Wert ernietlrigt.
7.7 Stringbehandlung
Concat(stringl, string2,String
Diese Funktion hängt beliebig viele Strings zusammen und gibt das Ergebnis als temporären String
zurück. Diese Funktion ist im Prinzip überflüssig, da man Strings auch mit „+“ aneinander hängen
kann.
Copy(string, pos, len): String
String Stringausdruck
pos: ganzzahlige Konstante
len: Lange (nicht-negativ)
Uefert den „len" Zeichen langen Ausschnitt aus „String" ab Position „pos“.
wrltelii(Copy<’O zerfretteiter Grunzwanzling', 6,7) )
gibt „frettel“ aus. Das Ergebnis ist übrigens stets ein temporärer String,
Falls „len“ negativ ist, wird ein Fehler gemeldet.
Pos (stringl, string2): integer
stringl, stringZ: Stringvariablen oder -konstante (keine temporären Strings!)
Diese Funktion sucht, ob der erste String im zweiten vorkommt, und liefert die Anfangsposition.
MaxonPASCAI.
172
Beispiele:
Pob(' a' ,'Hallo') = 2
Pos('ini' , 'Du mich auchl') = 4
PoaCha' , 'Hallo hallo') = 7, denn Groß-/Kleinschreibung wird
beachtet
Pos('' , 'Yxlegrümpf') = 1
PoB('Himpel','ForeverI') = o, denn "Himpel" kommt in "foreverl"
nicht vor.
StrLen(Striiig): integer
String; Zeichenkettc {String|n|, Str, Stringkonstantc, Char...)
Ermittelt die Länge des übergebenen Strings (also die Anzahl der Zeichen vor dem ersten Null-
Char).
Length (String): integer
Ist identisch mit „Strim“.
Insert (string, stringvar, pos)
String: String-Ausdimek
stringvar: Variable eines STRlNG|n)-Typs
pos: ganzzahlige Position, pos > = J
ln eine Stringvariable wird an einer bestimmten Stelle ein Stringausdruek eingefügt. Falls die
Position nicht po.sitiv ist, außerhalb der bisherigen Stringlänge liegt oder falls das Ergebnis zu lang
für die Stringvariable ist, wird ein Fehler gemeldet.
Beispiel:
VAR Bt, name: STRING;
BEGIN
Bt:= 'Hallo!';
Wrlte ('Name: '); ReadLn (Name);
Inaert (' '+Name, st, 6);
Writeln (Bt)
END.
Dieses Programm fügt den eingegebenen Namen und ein kerzeichen vor dem „!“ in die Variable
„st" ein und gibt dann also „Hallo...!" aus.
Delete (stringvar, pos, len)
stringvar; Variable eines STRING-Typs
pos: ganzzahlige Position, pos > = 1
len: ganzÄihlige Hinge, len > = ü
7. Prozeduren und Funktionen
173
Aus einer Zeiclienkette werden ab einer bestimmten Postion eine bestimmte Anzahl von Zeichen
VAR Bt: STRING;
BEGIN
Bt:= 'AMIGOXYA';
Delete (at, 5, 3);
WriteLn (st)
END.
ln diesem Programm werden die Buchstaben „OXV" aus dem Stting gelöscht.
Ergebnis:
AMI GA
RealStr( float, digits): String
tloat: Real-Ausdruck
digits: Stellenanzahl (ganzzahlig)
Wandelt die Real-Zahl in eine Zeichenkette imtl gibt diese zurück, und zwar exakt die Zeichenfolge,
die mit „Write(lloat:0:digits)“ ausgegeben würtle. Näheres zur Bedeutung des zweiten Parameters
steht im Kapitel über die Numerischen Datentypen, Die Zeichenkette, die „RealStr" zuruckgibt, ist
temporär (siehe auch Kapitel „Siringtypen").
IntStr (i): tempString
i; Longlnt-Ausdruck
Aus dem Ganzzahl-Ausdruck wird die entsprechende Dezimalzahl erz.eugt und als temporärer String
zuriickgegeben.
Beispiel:
InsStr(17)
ergibt
• 17 ' .
MaxonPASCAL
174
Val (String, numvar, intvar)
String: String-Ausdruck
numvar: Variable des Typs Real, Integer oder lx)nglnt
intvar: Variable des Typ.s Integer oder Cardinal/Word
Diese Prozedur versucht, den Stringausdruck „string“ in eine Zahl zu wandeln, und zwar abhängig
vom Typ der Variablen „numvar" in eine Real-, Double-, Integer- oder Longlnt-Zahl. Ist der String
eine korrekte dezimale Zahldarstellung (ohne führende oder folgende Leerzeichen!), so erhält
„numvar“ den entsprechenden Zahlenwert und „intvar“ den Wert 0. Falls der String nicht korrekt
gewandelt werden konnte, ist „numvar“ Undefiniert und „intvar" enthält die Nummer des ersten
Zeichens des Strings, das nicht paßt.
Beispiele:
Var R:Real; LrLong; I,p:Integer;
ValCdVll', R, p)
Val('-5', L, p)
Val('50000‘, I, p)
Val('+3.14149', L, p)
==> R=4.711E+4, p= 0
==> L=-5, p=0
==> l=undef., p=6
==> L=undef., p .3
(weil 50000 > MaxInt)
(tceino ganze Zahl)
8, Compiier-Anweisunsen
175
8. Compiler-Anweisungen, Includefiles und
Betriebsystemfunktionen ___
8.1 Compiler Directives
8.1.1 Includefiles
Es gibt in PASCAL eine Klasse von Anweisungen, die nicht zum Programm gehören, sondern zur
Steuerung des Compilers bestimmt sind. Sie sind leider nicht genormt. Es ist aber üblich, sie als
Kommentare zu tarnen:
{$Anweisung} oder (*$Anweisung*)
Wie Sie sehen, sind diese Compiler Directives äuiSerlich nichts anderes als Kommentare, deren
erstes Zcichen'ein J" ist. Der Compiler wird dadurch angewiesen, diesen Kommentar nicht etwa
wie gewohnt zu überlc.sen, sondern die darin enthaltene Anweisung sofort auszuführen.
.Aber gehen wir doch von der 'Pheorie gleich zum ersten Beispiel:
{$lncl "Dateiname" }
Diese Sequenz weist den Compiler an, eine Includedatei einzuladen.
„Was ist das?“
Es ist nicht immer sinnvoll, den gesamten Quelltext im Editor zu haben. Wenn Sie z.B. einige
Prozeduren bereits fertiggestellt haben, können Sie diese in einer Textdatei ablegen und aus Ihrem
Programm löschen, wodurch dieses kürzer und handlicher wird. Im Rest Ihres Programms weisen
Sie den Compiler an der Stelle, wo vorher der ausgelagerte Teil gestanden hat, mit einer Directive
an, diesen Teil als Includedatei zu laden. Er tut dann so, als würde der Inhalt der Datei an dieser
Stelle im Quelltext stehen, und compiliert so, als wäre nichts geschehen.
Zur Programmierung des Betriebs,Systems stehen Ihnen einige fertige Hilfsdateien zur Verfügung,
die Sie auf diese Weise in Ihr Programm übernehmen können. Doch dazu später mehr.
Alles, was hinter einer Directive steht, wird wie ein gewöhnlicher Kommentar überle.sen:
{$incl''Hallo'' Diese Anweisung öffnet die Includedatei "Hallo" }
Sie können aber auch mehrere Directives hintereinander hängen, indem Sie sie mit einem
Semikolon trennen bzw. verbinden (kommt auf den Standpunkt an):
t$incl "Hallo";Incl"Horrido“ ; include"Hallali" }
Wie Sie hier ebenfalls sehen, dürfen Sie statt „incl“ auch „include“ oder irgendetwas anderes schrei¬
ben - vorau,sgesetzt, es fängt mit „incl“ an. Fenier zeigt obiges Beispiel, daß die Groß- und
Kleinschreibung bzw. das Einschieben von Leerzeichen dem Compiler egal sind.
iMaxonPASCAL
176
Dieselbe Wirkung wie oben hätten Sie übrigens aucli einfaciier haben können:
($incl "Hallo”,"Horrido","Hallall")
Die Sache hat aUerdings noch einen Haken: die Dateien werden aus dem aktuellen Vereeichnis gela¬
den. Sie hätten natürlich auch einen ganzen Pfad angeben können, z, B. so:
{$incl "PASCAL :Includedateien/Gruß/Hallo" )
Wenn Sie aber mehrere solcher Dateien einladen wollen, wird es lang und umständlich. Zudem
mulsten Sie, wenn das Verzeichnis einmal wechselt (z. B. weil Sie auf der Diskette autgeräumi oder
sie umbenannt haben), alle Dateinamen ändern. Dagegen hilft eine andere Directive- PATH Unser
Beispiel sähe dann so aus:
{$path"PASCAL:Includedateien/Gruß/", incl"Hallo","Horrido",Hallall")
Dieses „path" gibt also einen alternativen Pfad an, üIkt den Indudedateien gesucht werden.
MaxonPascal sucht Indudedateien immer zuerst im aktuellen Verzeichnis und tiann über diesen
Pfad. Die Directive „$[)ath" ist aber ziemlich überllüssig, denn man kann den Suchpfad fürincludes
auch über den Compiler-Requester einslellen. Default ist „piiscahindude“.
Übrigens: Sie können Indudedateien auch verschachteln, d.h. eine Datei kann selbst wieder andere
einladen.
Nun gibt es noch ein weiteres Problem: Der Compiler ist zu schnell! Er ist so unverschämt schnell
daß die Floppy beim Compilieren von Includefiles nicht miikommt und der Compiler auf sie warten
muls. Das ist natürlich Zeitverschwendung - zwar eine, mit der man leben kann, aber trotzdem
ärgerlich. Deshalb gibt es bei der „Path“-Directive eine besondere Ojition: Sie können zwei verschie¬
dene Pfade, durch ein Komma getrennt, angeben, z. B. so:
{$path "ram:include","Pascal:include" }
Die Viärkung ist folgende: Bei „incl“ wird die Datei zuerst im ersten Veraeichnis (hier: „raiminclu-
de/“) gesucht. Ist sie dort vorhanden, wird sie auch von dort gele.sen. Falls dem aber nicht so ist
holt der Compiler die Includedatei über den zweiten Pfad. Und jetz.t kommt der raffinierte Trick: Sie
wird nicht nur einfach gelesen, sondern gleichzeitig in das ernte Veizeichnis kopiert, so daß sie beim
nächsten Compilerlauf dort zur Verfügung steht! Auf diese Weise können Sie sich ganz einfach und
automatisch die Dateien, die Sie benötigen, von der langsamen Diskette in die schnelle RA,M- cxler
R.AD-Disk kopieren...
Und es wird noch schöner: Beim Kopieren legt MaxonPASCAL liei Bedarf von selbst die
Untert'erzeichnisse an, .sofern sie noch nicht existieren! Im obigen Fall würde also immer zuerst
geprüft, ob lias Directory „raniinclude" bereits existiert. Zu diesem Thema noch ein Beispiel:
{$path "ram:include/","pascal:include/"}
{$incl "exec/tasks.h","exec/ports.h","devlcee/trackdisk.h"}
8. Compiler-Anweisunsen
177
liier werden drei der AMIGA-System-Includedateien eingeladen. Beim ersten Compileiiauf, wenn
die Ramdisk noch leer ist, liest MaxonPASCAL die Dateien aus dem Vei-zcichnis „PASCAl,:include“,
legt in licr Ramdisk mehrere verschachtelte Unterv'erzeichnisse an (erst „include“ und dann darin
die Unter-Unter-Directories „exec“ und „devices“) und kopiert die vier Dateien dahin. Bei allen fol¬
genden Compilierungen kann MaxonPASCAJ. dann wesentlich schneller auf die Includefiles xugrei¬
fen, so daß sie jeweils in Bruchteilen einer Sekunde übersetzt werden.
8.1.2 Bedingte Compilierung
Weitere Directives sind IF, FiLSE und ENDIF. Sie erlauben Ihnen, den Compiler zu steuern. Hinter
der IF-Directive ist eine Bedingung anzugeben, evtl, mit vorangestlltem „not“, ln der vorliegenden
Version ist aber erst eine einzige derartige Bedingung implementiert; „DEF ident". Diese Bedingung
ist wahr genau dann, wenn der dalünter angegebene Bezeichner definiert ist.
Ein Beis|)iel:
Program ConvpilerDirectives;
Const Deutsch=26731f { Löschen, wenn Englisch erwünscht }
Begln
t$if def deutsch}
writelnt'Hallo') ;
{$else}
writelnt'Hello') ;
{$endif}
{$if def yxlegrümpf}
Dieses hier wird immer überlesen.
{$endif}
End.
Auf diese Weise können Sie Ihr Programm in zwei Sprachen gleichzeitig schreiben. Je nach dem, ob
die Konstante (Sie könnten aber auch eine Variable, einen Typen, eine Prozedur... nehmen)
„Deutsch“ deliniert ist, erfolgt eine deutsch- oder englischsprachige Ausgabe. Beachten Sie aber den
gewaltigen Unterschied zur gewöhnlichen IF-Then-Else-PASCAL-Stiiiktur: Dabei falli die
Entscheidung während der Laufzeit des Programms, hier schon während des Compilierens. Ferner
wird hier das, was ausgeschlossen wird, vom Compiler völlig ignoriert, so daß es nicht einmal .syn¬
taktisch richtig sein muß.
Eine weitere Anwendung finden Sie in tlen meisten der mitgelieferten Includefiles. Unter diesen
Dateien herrscht eine gewisse Hierarchie: einige Irenötigen selbst wieder andere Indudedateien,
um vom Compiler verstanden zu werden. Bevor diese anderen Includes eingeladen werden, muß
aber geprüft werden, ob der Compiler sie nicht vielleicht schon längst geladen hat, denn sonst wür¬
de es zu Fehlermeldungen wegen Doppeldeklarierungen kommen. Deshalb enthält z. B. die Datei
„exec/devices.h“ diese Zeilen:
{$if not def EXEC_DEVICES_H }
Const EXEC_DEVICES_H=0;
{$lf not def EXEC_LIBRAHIES_H; incl"exec/librarles.h";endif}
MaxonPASCAL
178
{$if not def EXEC__PORTS_H; lnol"exec/ports.h“;endif}
...Hier kommt der eigentliche Inhalt der Datei...
{$endi£}
Um die ganze Datei legt sich hier eine IF-ENDIF-Klammer, die sichert, daß diese Datei wirklich nur
einmal vom Compiler übersetzt wird. Um dies feststellen zu können, wird innerhalb dieser
Konstruktion eine Konstante namens „exec_devices_h“ definiert. Ferner benutzt die Datei
Bezeichner, die in den Dateien „exec/libraries.h“ und „exec/ports.h“ deklariert werden. Auch diese
Dateien deklarieren Bezeichner, die wie die jeweilige Datei heißen. Damit kann der Compiler prü¬
fen, ob er diese Dateien schon übersetzt hat, und sie nur dann öffnen, wenn dies nicht längst
geschehen ist.
8.1.3 Error
MaxonPASCAL hat noch einige weitere Directives auf Lager, z. B. „Error“. Damit können Sie sich
individuelle Fehlermeldungen ausgeben lassen.
Eine denkbare Anwendung wäre z.B., wenn zwei Includedateien sich gegenseitig ausschließen, weil
es zu Doppeldeklarierungen kommen würde. Ein Beispiel: Sie wollen ein Programm sowohl in einer
deutsch- als auch in einer englischsprachigen Version schreiben. Dazu deklarieren Sie alle Texte in
zwei verschiedenen Dateien als String-Konstanten. Die Datei „Deutsch.texte“ könnte dann etwa so
aussehen:
{$if def Engliach_texte;
Error "Sie können nur eine Sprache verwenden”;
eise }
Const
Deutsch_texte= 0;
Gruß = 'Guten Tag!';
Abschied = 'Auf Wiedersehen!';
{$endlf}
„Englisch.texte“ wäre dann genau anders ‘rum:
{$if def Deutsch_texte;
Error"Sie können nur eine Sprache verwenden";
eise }
Const
Engllsch_texte= 0;
Gruß = 'Hello!';
Abschied - 'Bye!';
($endl£}
Bei zwei so einfachen Includedateien ist es natürlich kein Problem, auch ohne derartige
Fehlermeldungen die Übersicht zu behalten. Wenn Sie aber einen ganzen Haufen ineinander ver¬
schachtelter Dateien anlegen, kann dies recht nützlich werden. Denn wenn in einer Includedatei ein
8. Compiler-Anweisungen
179
Fehler auftritt, setzt der Compiler den Editor- Cursor nicht etwa auf die fehlerhafte Stelle (die ja gar
nicht im Arbeitsspeicher, sondern in einer Datei liegt), sondern auf die zugehörige „incl“-
Anweisung.
8 , 1.4 Linkersteuerung
Mit der Compiler-Anweisung
{$link "dateil", "dateiZ", ... , "dateix" )
wird der Linker angewiesen, die angegebenen Dateien zu laden und zum compilierten Programm
hinzuzulinken. Die Dateien werden, wenn der Compiler auf diese Directive stößt, sofort geladen;
gelinkt wird aber erst nach dem erfolgreichen Compile-Vorgang.
Die Directive darf, wie alle anderen auch, an jeder Stelle des Quelltextes stehen.
Im Gegensatz zu „incl“ gibt es zu „link“ keine Pfad-.Anweisung und auch keine L'mkopier-
Möglichkeit.
Die Directive „ulink“ arbeitet wie „link“, holt die Datei aber aus dem in der Config-Datei angegebe¬
nen Unit-Verzeichnis. Im Make-Modus werden "flink" und "funlink" grundsätzlich ignorien, da hier
die Projektverwaltung für das Linken verantwortlich ist. Alles weitere zu dieser Directive finden Sie
im Kapitel 9 „Units und Module“.
8.1.5 Compiler-Optionen
Mit dem Pull-Down-Untermenü „OptJonen/Compiler“ können Sie einige Compiler-Optionen ein¬
stellen. Der Nachteil: Diese Einstellungen wirken nur global, gelten also für das gesamte Programm,
und es geht nicht aus dem Quelltext hervor, welche Einstellung sinnvoll ist, so daß man immer,
wenn man einen Quelltext in den Editor lädt, die Optionen von Hand einstellen muß.
Deshalb gibt es eine Compiler-Directive, mit der man diese Einstellungen vornehmen kann. Sie
heißt
{$opt paral, para2, ... , paraX )
Syntax für einen einzelnen Parameter-.
((„t« |..b"|"s"l"a") {" + " I "-" I "0")) I "q"
Die Anfangsbuchstaben der Parameter entsprechen den Tasten im Tastatur-Untermenü
„Preferences“ und wirken auch .so:
{$opt q } schaltet alle Optionen aus („Quick")
{$opt x-r} die Option „x“ (hier ist natürlich „t“, „i“, „b“, „s“ oder „a“
einzusetzen) wird eingeschaltet - entspricht „ON“ im Tastaturmenü
oder einem abgehakten Punkt im Pull-Down-Menü.
schaltet die Option „x“ aus („x“ wie oben zu ersetzen).
{$opt X- }
MaxonPASCAL
180
{$opt xO} die entsprechende Option wird auf den Wert geschaltet, der im
Menü eingestellt ist. Dies ist natürlich nur sinnvoll, wenn die Option
vorher mit „x+“ oder „x-“ ein- oder ausgeschaltet wurde.
Beispiele:
{$opt q,s+}
schaltet alle Optionen außer dem Abfangen eines Stacküberlaufs aus.
s: = 0 ;
{$opt b-,a-}
FOR 1:=1 to 1000 do 8:= s + a[i];
{$opt b0,a0}
In diesem Programmfragment werden die 1000 Elemente eines Arrays summiert, Um dies zu
beschleunigen, werden vor der Schleife die Unterbrecliungsmöglichkeit (mit Taste <F10>) und
die Prüfung auf Überlauf ausgeschaltet. Nach der Schleife vens'endet der Compiler wieder die
Einstellung des .Menüs.
Die Optionen gelten also von der Stelle an, w'o die „opt“-Directive steht, bis sie durch eine folgende
Directive wieder anders ge.setzt werden. Am Anfang, also vor einer „opt“-Directive, verwendet der
Compiler natürlich wie gewohnt die im Menü eingestellten Optionen,
Nun aber das Wichtigste: Die Bedeutung der einzelnen Optionen.
f - Subrange testen
Bei Wertzuweisungen an als Ausschnitcstyp deklarierte Variablen ist zur laufzeit der Wertebereicb zu
prüfen. Alter man benutzt Ausschnittsypen ja gerade, um solche Bereichsüberprüfungen durch¬
führen zu lassen, so daß man diese - defaultmäßig aktivierte - Option wohl nur ausschalten wird,
wenn man eine Exe-Datei eines ausgetesteten Programms erzeugen lassen will.
Bei Zuweisung konstanter Werte wird der Bereich schon zur Compile-Zeit geprüft, und zwar unab¬
hängig von der „t“-Option. Das folgende Programm wird also immer eine Compiler-Fehlermeldung
verursachen:
Var n: 1..100;
Begin ii:= 101 End.
Dagegen findet bei folgendem Programm die Prüfung zur Laufzeit statt, und zwar nur dann, wenn
die Option „t“ aktiv ist:
Var n: 1..100;
Begin
n:= 100; { im erlaubten Bereich }
ni= n+1; { Bereichsüberschreitung, erst zur Laufzeit feststellbar }
End.
8. Compiler-Anweisunscn
181
/ - Indexbereich bei Array-Zugriff
Diese Option sorgt ilafür, daß bei jedem Zugriff auf ein Array-Element getestet wird, ob der Index im
richtigen Bereich liegt. Man sollte diese Option nur ausschalten, wenn das Programm wirklich
durchgetestet und debiiggt ist, denn die Polgen können sonst gleichermaßen fatal (GURU!) wie
heimtückisch (Fehler schwer zu finden) sein: Zwar liefert ein Lesezugriff auf ein nicht-existentes
Feldelement nur einen Undefinierten Wert, aber eine derartige Wertzuweisung schreibt einen Wert
irgendwo in den Speicher. .Meist (jedenfalls bei geringen Abweichungen vom deklarierten
Indexbereich) liegt an dieser Stelle eine andere Variable, die dann aus scheinbar unerklärlichen
Gründen einen anderen Wert erhält - vael Spaß bei der Fehlersuche...
Es kann aber auch passieren, daß Sie das System zerschießen und Ihr .AMIGA wieder ‘mal nach
Indien pilgert. Also Vorsicht beim Au.sschalten dieser Option!
Beispiel:
{$opt i-}
Var a: Array[1..10] of integer;
k: integer;
Begin
k:= 42;
a[0]:= 26731; { FALSCHER INDEX!II )
writeln(k)
End.
Dieses Programm gibt „2673 P‘ aus.
b - Unterbrechen
Es ist au.sgesprochcn ärgerlich, wenn ein Programm während eines Probelaufs unaufltaltbar in einer
Endlos-Schleife hängenbleibt. Zwar kann man dann den Quelltext problemlos speichern, aber man
muß neu booten, um tias Programm zu stoppen. Deshalb gibt cs eine Taste zum Alibrechen von
PASC.AL-Programmen - nämlich tlie Punktionstaste <F]0>. Wenn die Option „b“ aktiv ist, baut dei'
Compiler an geeigneten Stellen Tastaturabfiagen in den Code ein, und zwar überall dort, wo eine
Endlosschleife entstehen könnte:
Ȋ' Am .Anfang von WFIILE- und REPEAT-Schleifen
“äc Bei Labels
T*' Innerhalb jeder FOR-Schleife (die zwar theoretisch nicht endlos, prakti.sch aber ganz schön
lang sein kann)
tw Am Anfang von Unterprogrammen (endlose Rekursion!)
Lim nicht mehr Zeit als unbedingt nötig zu brauchen, fragt das Programm die Tastatur
hardwaremäßig ab - auf einem .Multitasking-System gewiß nicht das Gelbe vom Ei, denn stellen Sie
sich einmal vor, Sie lassen Ihr mit MaxonP.ASCAL entwickeltes Apfelmännchen-Programm im
MaxonPASCAL
182
Hintergrund rechnen, während Sie schon das nächste Programm entwickeln und dabei im
MaxonPASCAL-Editor mit der Taste <F]0> ans Textende springen...
Sie sehen also, dalS die Abbruchmöglichkeit mit <F]0> nur als Notausstieg während der
Programmentwicklung taugt. Wenn Sie ein Programm schreiben, das der Benutzer abbrechen kön¬
nen soll, ist es wohl besser, an geeigneten Stellen (zum Beispiel in Schleifen - siehe oben!) mit dem
„CBreö^“-Befehl oder der Funktion „Breakfl)“ die Tastenkombination „ C“ abzufragen.
Wenn Sie ein Programm geschrieben haben, das länger rechnen soll (ein paar Minuten, über Nacht
oder so), ist es oft keine leichte Entscheidung, ob man die Breakpoints setzen soll. Wenn Sie sie
rauslassen, riskieren Sie, Ihr Programm nur noch durch einen Reset abbrechen zu können. Der
Laufeeithedarf der Tastenüberprüfung ist unterschiedlich, macht sich aber vor allem bei engen
Schleifen bemerkbar: Die Laufzeit einer leeren FOR-Schleife steigt dadurch um ca. 75%, wenn die
Schleife aber nennenswerte Anweisungen enthält, ist der Laufzeitaufwand eher marginal.
Beispiel:
VAR L,S:Long;
BEGIN
{$opt q,bO)
S:= 0;
POR L:=l to 200000 DO S:= S + (L-10000)
END.
Bei dieser kleinen Schleife steigt die Laufzeit durch die Abbrechmüglichkeit nur noch um ca. 25%,
und wenn der Schleifenkörper mehr Anweisungen enthält (dürfte die Regel sein), ist der
Zeitaufwand für die Tastaturabfrage im Vergleich zu den resdichen „Kosten“ eines einzelnen
Schleifendurchlaufe lächerlich gering.
5 - Stacküberlauf abfangen
Auf dem Stack (Stapelspeicher) werden zur laufzeit die nicht als STATIC deklarierten Variablen
abgelegt (lesen Sie dazu bitte auch den Abschnitt „dynamische und statische Variablen“ im Kapitel
„Module“).
Die Option „s“ sorgt nun dafür, daß dabei stets auch geprüft wird, ob noch genug Speicher frei ist -
andernfalls nimmt das Programm sich den Speicher einfach, egal, ob 'w'as frei ist oder nicht.
Auch diese Compiler-Option benötigt etwas (aber nicht viel) Laufzeit. Vor allem (falls überhaupt)
macht sich die Verzögerung bei rekursiven Prozeduren bemerkbar - aber gerade dort ist sie eigent¬
lich unverz.ichtbar, denn der Stackbedarf von Rekursionen läßt sich nur schwer abschätzen und wird
auch nicht bei „Linear Stack Requirement“ berücksichtigt.
a - Überlauf bei arithmetischen Operationen melden
Bei arithmetischen Operationen wird jeweils auf Über- oder Unterlauf geprüft. Dies kostet vor allem
bei Additionen und Subtraktionen von Integer-Zahlen (aller Längen, versteht sich) Laufzeit. Bei dem
8. Compiler-Anweisungen
183
folgenden Programm erhöht es beispielsweise die Reehenzeit um etwa 25 Prozent. Bei
Multiplikationen oder .sämtlichen REAl.-Opei'ationen ist der Effekt nicht so gravierend, da diese
Operationen ohnehin ewig dauern (nach Computer-Maßstäben).
VAR i,j,k,l.m:integer;
BEGIN
{$opt q,aO)
1 := 0 ;
m: = 0;
FOR i;=l TO 50 DO
FOR j:= 1 TO 50 DO
FOR k:= 1 TO 100 DO
BEGIN
1:= i+j-k
m:= 1+k
END;
END.
.Achtung; Bei LongReal-Rechnungen kommt es nicht zu einer Fehlermeldung, sondern zu einer
Fatception, und zwar unabhängig von dem „a“-Compilersw'itch!
8.1.6 Kurzauswertung boolescher Ausdrücke
Werten Sie dtK’h einmal den folgenden logischen Ausdruck aus:
((1 < 0) and (2<3>) or {(l<2)or(l=2))
Falls Sie ein wenig Erfahrung mit boolescher Algebra haben, werden Sie gar nicht alle Terme des
Ausdrucks betrachten, sondern etwa so Vorgehen: Der linke Teil der AND-Verknüpfung ist FALSE,
also ist das Ergebnis unabhängig von der rechten Seite FALSE. Bei der zweiten OR-Verknüpfung ist
der erste Term TRUE, also auch das Ergebnis dieses OR. Das Gesamtergebnis des Ausdrucks ist also
TRUE.
Sinnvollerweise kann MaxonPASCAL logische Operanden genauso auswenen: Ist der erste Operand
von AND logisch falsch oder der erste von OR wahr, wird der zweite Operand gar nicht erst betrach¬
tet, denn der hat auf das Ergebnis keinen Einlluß mehr.
MaxonPASCAL 1.0 wertete noch immer beide Operanden aus, bevor es das Ergebnis berechnete.
Aus Gründen der Kompatibilität gibt es in Version 3 aber einen Umschalter, mit dem man eine Voll-
Auswertung erzwingen kann. Er wurde in Form einer Compiler- Directive realisien und heißt wahl¬
weise
{$bool full) oder {$bool all).
Die Einstellung gilt dann, wie gewohnt, von der Stelle an, wo die Directive steht, bis zu der Stelle,
wo wieder umgeschaltet wird. Das geschieht mit
{$bool min) oder {$bool fast),
ganz wie Sie wollen.
MaxonPASCAI.
184
Jetxt Stehen Sie möglicheroeise wieder an der Stelle, wo Sie ausrufem „Was soll das?“, oder vielleicht
auch; „Cui bono?" Denn da es ja klar ist, dalS die Kurzauswertung Zeit spart, hat man nicht das
Bedürfnis, in einen langsameren Modus zu schalten. Oder?
Natürlich h:it es auf das laiufeeitvcrhalten eines Programms keinen Einfluß, ob ein Teilausdruck wie
„2 <3“ ausgewertet wird oder nicht.
Allerdings können Sie in booleschen Austlrücken auch Funktionen mit Seiteneffekt betrachten, d. h.
selbstdefinierte Funktionen, in deren AnweLsungsteil globale Variablen veräntlert w'erden (schreckli¬
cher Programmierstil!) oder die Ein- (xier Ausgaben machen. Ein Beispiel für letztere Unart:
Progreim
Die_vogoniache_Poesie_ist_die_drittschlechteste_des_Universuins;
Function Frage: Boolean;
Var c: Char;
Begin
writet'Wollen Sie das Gedicht wirklich lesen? '); readln(c);
Frage:= (c In [ ■ j ', 'J'])
End;
Function Bestätigung: Boolean;
Var c: Char;
Begin
writet'Sind Sie ganz sicher? ■); readln(c);
Bestätigung:= (c In t'j', ’J'])
End;
{$bool full - bewirkt hier fehlerhaften Programmablauf! }
Begin
If Frage and Bestätigung Then
writelnt'Na gut. Sie haben es nicht anders gewollt:' \10\10,
'O zerfretteiter QrunzwanzlingI’\10,
'Dein Harngedränge ist für mich'MO,
'Wie Sohnatterfleck auf Bienenstich.\e'0;33mWü',
''\e'Büü'\e'Büä'\e'Bä'\e'Bä'\8\e'Bä'\8\e'Br'\8\e'Bg'\8,
' '\e'B.'\8\e'B.'\8\e'B. ')
End.
Jede der beiden Functions fragt den User, oh er sich das Gedicht wirklich antun will, und gibt die
Antwort als booleschen Wert zurück.
Normalerweise steigt das Programm aus, wenn die erste Frage nicht mit ,Ja“ beantwortet wird.
„Bool Full“ bewirkt aber, daß dann trotzdem noch die zweite Frage gestellt und erst dann der
Ausdruck au.sgewertet wiixl. Natürlich kann man sich auch umgekehrt Programme konstruieren, die
ausschließlich mit „Bool Full“ korrekt laufen, aber das dürfte in der praktischen Programmierung
kaum Vorkommen, so daß defaultmäßig Kurzauswertung vorgenommen wirtl. Wenn Sie aber ein
mit Ma-xunPASCAL entwickeltes Programm portieren wollen, sollten Sie daran denken, daß nicht
jeder Compiler Kurzauswertung behen'scht - zum Beispiel die Version 1.0 von MaxonPASCAL!
8. Compiler-Anweisungen
185
8.1.7 Behandlung von Ein-ZAusgabefehlern
Die saubere Programmierung von Ein- und Ausgalieoperationen ist oft eine lästige Angelegenheit,
denn hier muß das Programm mit einem Benutzer, einem Peripheriegerät oder dergl. kommunizie¬
ren, wobei es praktisch immer zu Fehlern kommen kann. Typische Beispiele sind Fehleingaben des
Benutzers, der Versuch des Lesens einer nicht vorhandenen Datei u.sw. Wenn man ein Programm
nicht nur selbst benutzen, sondern auch anderen Anwendern zugänglich machen will, muß man bei
jeder nennenswerten F*A-Operation dafür sorgen, daß crentuell auftretende Fehler nicht zu einem
Fehlverhalten des Programms führen (OK, bei einfachen Bildschimiausgaben mit Write[Ln] dürften
in ewa nie Fehler auftreten).
Der Normalfall ist, daß nach einer EA-Operation die Funktion „lOResult“ eine Fehlernummer <> 0
liefert, so daß das Programm den Fehler erkennen und in geeigneter Weise darauf reagieren kann.
Seit Version 2.0 gibt es aber die Möglichkeit, Code erzeugen zu lassen, der bei einem E.A-Fehler mit
einer Fehlermeldung aussteigt. Das ist zwar zugegebenermaßen nicht die benutzerfreundlichste .\rl
der Fehlerbehandlung (man hat gerade 1000 Adressen in sein Dateiprogramm eingetipt und dann
steigt das Ding beim Abspeichern aus...), aber wenigstens w'eiß der Benutzer cLann, das etwas schief¬
gelaufen Ist.
Das funktioniert, wie alles in diesem Kapitel 8.1, über eine Compiler Directive. Sie heißt wahlweise
„i“ (ist kompatibler) oder „io" (ist aussagekräftiger) und wird von einem „+“ {Fehlerkontrolle ein¬
schalten) oder einem (im fttlgenden Fehler ignorieren) gefolgt.
VAR i, j: integer;
BEGIN
Write ('Bitte zwei Zahlen eingeben: ');
{$io+: ab jetzt bei Fehlern ausateigen }
Read (1);
{$io-: ab jetzt Fehler ignorieren )
Read (j) ;
IF lOReault <> 0 THEN
Write ('Die zweite Eingabe war nicht richtig.');
Writeln;
Write ('Eingabe war: ', i:8, j:a)
END.
Bei Eingabe „x 4“ steigt das Programm mit einer Lautzeitfehlermeldung aus, während cs bei Eingabe
„4 x“ den Fehler erkennt und meldet.
MaxonPASCAL
186
Sie können sich die Funktionsweise der |io-Directive im Prinzip so vorsteUen, als ob hinter jede
Anweisung, die mit EA zu tun hat,
IF lOResult <> 0 TUEN Error ('File error');
geschrieben würde.
Folgende Prozeduren werden von $io behandelt:
CIrScr
Get
Page
Put
Read
ReadLN
Reset
Rewrite
Seek
Write
WriteLN
Bei aktivierter $io-Option kann Ihr Programm noch nicht einmal Fehler, die beim Öffnen einer Datei
auftreten, selbst abfangen. Deshalb ist es nicht sinnvoll, sie für das ganze Programm einzuschalten.
8.2 Libraries
Das Betriebssystem des AMIGA ist in mehrere Libraries aufgeteilt. Mit MaxonPASCAL können Sie alle
diese Funktionen verwenden. Dazu müssen sie aber zuerst deklariert werden.
Jede Library besitzt eine Basisadresse. Unterhalb dieser Adresse liegt im Speicher stets eine Tabelle
von Sprungbefehlen, die zu den jeweiligen Libraryfunküonen führen. Die Differenz zwischen der
Basisadresse der Bibliothek und der Adre.sse des Einsprungs heißt der Offset der Funktion. Diese
Offsets sind stets negaüv (weil ja die Sprungtabelle, wie gesagt, unterhalb der Basisadresse liegt)
und ist durch 6 teilbar (weil ein normaler Sprungbefehl in Maschinensprache 6 B^tes belegt).
Zunächst brauchen Sie also die Basisadresse der Library, die Sie benutzen wollen. Die Basen der
„exec.library“ und der „dos.library" stehen Ihnen durch die Variablen „SysBase“ und „DosBase“ zur
Verfügung, bei allen anderen Bibliotheken erhalten Sie die jeweilige Basis mit Hilfe der Prozedur
„Open_Library“, die bereits im Kapitel „Prozeduren und Funktionen“ erläutert wurde. Diese
Adresse müssen Sie in irgendeiner Variablen ablegen, die vom Typ „Long"/''LongInt‘' oder einem
Pointertypen sein kann.
■Als nächstes sind die einzelnen Funktionen der Library zu definieren. Eine Library-Deklaration kann
irgendwo im Deklarationsteil des Programms bzw. eines Unterprogramms stehen und hat folgende
Syntax:
"Library" Basis {Offset ProcOrFuncHeading I";"]} "End;"
8. Compiler-Anweisungen
187
Als Beispiel betrachten wir einen Teil der „exec.library“, den Sie in dem Includefile „exec/lists.h“ fin¬
den. Es beginnt mit dem Kopf:
Library SysBase:
Als Basis kann man einen beliebigen Ausdruck verwenden, aber eine einfache Variable ist wohl am
sinnvollsten.
Nun folgen die einzelnen Prozeduren und Funktionen. Die erste heißt „Insert" und hat den Offcet -
234. Da es aber zu einer Kollision mit der gleichnamigen .MaxonPASCAL-Prozedur kommen würde,
mußte sie umbenannt werden, und zwar in „_Insert“. Das ist möglich, denn die
Betriebssystemfunktion „weiß" ja überhaupt nichts davon, unter welchem Namen sie aufgerufen
wurde ■ Hauptsache, der Offset und die Parameter stimmen.
Also sieht die Deklaration so aus;
-234: Procedure _Insert(aO!p_LiBt; al,a2: p_Node);
Der Teil hinter dem ist ein ganz normaler Prozedurkopf Nun weiß der Compiler, daß dieser
Procedure drei Parameter zu übergeben sind, von denen der erste vom Datentyp „p_List“ und die
beiden anderen vom Typ „p_Node“ sind (diese beiden Datentypen wurden natürlich zuvor in dem
Includefile definiert). Nun müs.sen die Parameter aber nicht in irgendwelchen Variablen, sondern in
Prozessorregistern übergeben werden.
Der Prozessor 68000 hat die acht Datenregister dO, dl,.. d7 und acht Adressregister („aO“ bis „a7“).
ln allen diesen Registern können den Betriebssystemfunktionen Parameter übergeben werden - mit
drei Ausnahmen: „a7“ ist der Stackpointer, in „aö" wird unmittelbar vor dem Aufruf die Basisadresse
gelegt und .,a5“ hat in MaxonPASCAL eine besondere interne Bedeutung. Diese drei Register dürfen
also nicht verändert wenlen.
Zurück zum Beispiel: Es folgen noch sechs Prozeduren und eine Funktion:
-240:Procedure AddHead(aO:p_Li8t; al:p_Node);
-246:Procedure AddTail(aO:p_LiBt; al:p_Node);
-252 rProcedure Hemove{al:p_Node);
-258:Procedure RemHead(aO:p_LlBt);
-264 rProcedure RemTail(aO:p_LiBt);
-270rProcedure Enqueue(aO:p_LiBt; al:p_Node);
-276rPunction FindName(aO:p_Llst; al:Str):p_Node;
Man beendet die Library-Deklaration mit:
End;
Noch einmal das Ganze im Überblick:
Library SysBase:
-234 : Procedure _IiiBert (aO :p_Li8t; al, a2 :p_Node) ;
-240rProcedure AddHeadtaO:p_Liat; al:p_Node);
-246:Procedure AddTail(aO:p_List; al:p_Node);
MaxonPASCAL
188
-252:Procedure Remove{al:p_Node)f
-258:Procedure RemHead(aO:p_List);
-264:Procedure RemTail(aO:p_Li8t);
-270:Procedure Enqueue(aO:p_Llst; al:p_Node);
-276 :Function FindNeune (aO:p_List; al! Str) :p_Node;
End;
Aber keine Panik: Natürlich müssen Sie solche Tabellen nicht ständig selbst schreiben - warum soll¬
ten Sie das Rad immer wieder neu erfinden? Die Library-Deklarationen finden Sie in den Includefiles
auf einer Ihrer MaxonPASCAl.-Disketten. Genaueres dazu im nächsten Kapitel.
Alles, was Sie wissen müssen, ist, daß die Exec- und DOS-Library beim Programmstart immer schon
geöffnet sind. Bei den anderen Libraries dürfen Sie nie vergessen, sie am Progratnmanfang mit
„üpenDb“ zu öffnen, denn andernfalls ist Ihnen der Guru sicher (ich habe das auch einmal verges¬
sen und bin dann bei der Fehlersuche fast wahnsinnig geworden, weil ich nicht auf die Idee kam,
mal am Programmanfang nachzusehen).
8.3 Anmerkungen zu den Include-Files
Die Include-Dateien enthalten alles, w'as Sie zur Programmierung des AMIGA-Betriebss>'stems
benötigen: Konstanten, Typen (Strukturen) und Libraries. Sie entsprechen Im wesentlichen den
nonnalen „C“-Includefiles. Nur hin und wieder mußten die besonderen Gegebenheiten der Sprache
PASCAL berücksichtigt werden.
Zuerst w'ären da Kollisionen mit PASCAL-Schliisselwörtem zu erwähnen. Die beiden wichtigsten:
einige Strukturen (z. B, ..NewScreen“) enthalten ein Feld mit dem Namen „Type“, und in Exec gibt
es einen Datentypen namens „Library“. Diese Probleme wurden jeweils gelöst, indem diesen
Bezeichnern ein Uniterstrich vorangestellt wurde („_Library“, „_Type“). Genauso wurden die
Problemfälle behandelt, die dadurch entstanden, daß PASCAL nicht zwischen Groß- untl
Kleinschreibung unterscheidet; in „intuition/intuition.h“ gibt es sowohl die Konstante „CI05£WW-
DOW'' als auch die Prozedur „G/aseW'mz/o«'“ sowie weitere derartige Kollisionen bei „reportmome“
und (in „intuition/screens.h“) bei „showtille“. ln derartigen Fällen hat stets eine Prozedur Vorrang
vor einem Datenttpen und dieser wiederum vor einer Konstanten, was in den genannten Fällen
konkret heißt, daß tien Konstantennamen stets ein vorangestellt wurde.
Die dos.librarv' enthält einige Funktionen und Prozeduren, deren Namen mit PASCAL-Bezeichnern
kollidieren: „Read“, „Write“, „Close“, „Seek“, Jnput“ und „Output“. Diese Funktionen erscheinen in
den Includefiles jeweils zw'eimal: zum einen, wie gehabt, mit am Anfajig („_\Vrite“), zum ande¬
ren mit vorangestelltem „Dos“ (z. B, „DosWrite“). Sie halten also die Wahl, welche Namen Sie benut¬
zen wollen.
Weitere Kollisionen: Der Datentyp „Filehandle“ in der Datei „libraries/dose.xtens.h" wurde in
„JFilellandle“ umbenannt, und die Funktion „Text“ der graphics.library kann wahlweise als „_Texi"
oder ulfi „GfxText" autgerufen werden.
8. Compiler-Anweisungen
189
Bei MaxonPASCAL gibt es keine Datei „functions.h" wie in C, vielmehr sind die
Funktiünsdefinitionen auf verschiedene Intiudeliles verteilt: Die Funktionen der exec.library stellen
in verschiedenen Dateien, und zwar jeweils da, wt) die zugehörigen Datentypen definiert werden.
Sie brauchen sich darüber also normalerweise keine Gedanken zu machen. Für die anderen
Libraries wurden entweder „.Iib“-Files angelegt, in tlenen ihre Funktionen tieklariert werden, oder
sic wurden anderen Indudefiles ..beigepackt“.
Hier ist eine Liste aller zur Verfügung stehenden Libraries, ihrer Basisvariablen und der Dateien, in
denen siedeklariert werden:
NAME
BASIS
DATEI
amigaguide.library
AmigaGuideBase
amigaguide.lib
asi.library
AsIBase
asl.lib
battclock.library
BattClockBase
battclock.lib
bullet.library
BulletBase
bullet.lib
cardres.library
CardResource
cardres.lib
clist.library
CListBase
clist.lib
colo wheel. library
ColorWheelBase
colorwheel.lib
commodities.library
CxBase
Commodities.lib
console.library
ConsoleBase
devices/console.h
datatypes.library
DataTypesBase
datatypes.lib
disk,library
DiskBase
disk.lib
diskfont.library
DiskFontBase
libraries/diskfont.h
dos.library
DosBase
libraries/dos.h
dtclass.library
DTClassBase
dtclass.lib
exec.library
SysBase
exec/#?.h
expansion.Iibrary
ExpansionBase
libraries/expansionbase.h
gadtools.library
GadToolsBase
gadtools.lib
graphics.library
GfxBase
graphics.lib
icon.library
IconBase
workbench/icon.h
iffparse.library
IFFParse
iffparse.lib
intuition.library
IntBase
intuition.lib
keynnap.library
KeymapBase
keymap.lib
layers.library
LayersBase
layers.lib
Locale.library
LocaleBase
locale.lib
mathieeedoubbas.library
MathleeeDoubBasBase mathieeedoubbas.li
mathieeedoubtrans.library
MathleeeDoubTransBase mathieeedoubtrans.
misc.library
MiscBase
misc.lib
potgo.library
PotgoBase
resources/potgo.h
rexxsysiib.library
RexxSysBase
rexxsysiib.lib
timer.library
TimerBase
devices/timer.h
translator.library
TranslatorBase
libraries/translator.h
utilitiy.library
UtilityBase
Utility.lib
workbench.library
WorkbenchBase
wb.lib
MaxonPASCAL
190
Noch eine Bemerkung zu den zahlreichen Datentypen, die in den Includefiles definiert werden: Zu
jedem Record-Typen existiert ein Zeigertyp, der den Namen des Record-Typs mit vorangestelltem
„p_“ trägt, z. B. „Window“ und „p_Window“. Der Grund dafür ist, daß an einigen Stellen
(Parameterlisten) in PASCAL nur Typbezeichner wie z. B. „p_Window“, aber keine
Typbeschreibungen (wie „ ^ Window“) erlaubt sind.
9. Units und Module
191
9. Units und Module _
9.1 Modulare Programmierung: was, warum und wie?
MaxonPASCU bietet Ihnen seit Version 2.0 ein Feature, das (wie viele andere nützliche Dinge auch)
in Standard-PASCAL fehlt: das Konzept der mrxiularen Programmierung. Die Grundidee ist die, dalä
ein Programm in beliebig viele sog. Module auigeteilt wird, die dann mehr oder weniger unabhängig
voneinander ediert und compiliert und erst danach zu einem einzigen Programm zusammengebun¬
den werden. Das Zu.sammensetzen der Module heißt „linken“. Sicher ist Ihnen bereits die Ausgabe
,.I.inking...“ am Ende des Compilevorgangs von MaxonPASCAL aufgefallen.
MaxonPASCAL ruft den integrierten Linker immer automatisch auf, auch dann, wenn es bei einem
nicht-modularen Programm scheinbar nichts zu linken gibt (gibt es aber doch; das Programm wird
mit dem P,^SCAL- Laufzeitsystem zusammengebunden).
Es gibt viele gute Gründe, sein Programm in Module zu zerstückeln:
■SS- Die einzelnen Quelltexte w'erden kürzer. Da man immer nur das Modul neu compilieren lassen
muß, das man gerade bearbeitet, werden auch die Compilezeiten kürzer (bei MaxonPASCAL
sowieso kein Thema).
Auch der Workspace-Speicherbedarf sinkt (bei MaxonPASC.AL sehr wohl interessant, denn das
Programm benötigt ja einen zusammenhängenden Speicherblock, und da wird es schnell eng).
Lange Programme werden überschaubarer, wenn man .sie sinnvoll in Module aufteilt. „Sinnvoll“
heißt hier, daß die Einteilung nicht willkürlich erfolgt, sondern die Module jeweils einen zusam¬
mengehörigen Bereich des Programms umfassen. Zum Beispiel könnte man eine
Dateiverwaltung in die Module „Benutzeroberfläche“, „File-Handhabung“ und „Such- und
Sortierprozeduren“ unterteilen, was sich dann noch beliebig weiter verfeinern und zerkleinern
ließe.
.Man kann sich aus immer wieder benötigten Programmteilen eine Bibliothek aus Modulen, die
man bei Bedarf nur noch einlinken muß, zusammenstellen. Dafür eignet sich besonders das
UNIT-Konzept.
Viele Leute glauben auch, Mtxlule seinen für Programmentwicklungen im Team hilfreich, da
dann jeder Programmierer seinen Teil des Projekts unabhängig von den anderen erstellen kann.
Nun ja, T.e.a.m. steht bekanntlich für „Toll, ein anderer macht’s“, und der eine, an dem norma¬
lerweise letztendlich die ganze Arbeit hängen bleibt, kann auch ohne Modulkonzept auskom-
men. Sollten in einem Team jedoch wirklich einmal mehrere Leute arbeiten, so ist
Unabhängigkeit alles andere als wün.schenswert, denn es bricht regelmäßig ein Chaos herein,
sobald die Module zusammengefügt werden sollen (.An genau dieser Stelle möchte ich mit
einem herzlichen „Core Dumped!“ das Juhunix-Propra-Power-Team grüßen). Wenn aber
tatsächlich einmal der unwahrscheinliche Fall eintreten sollte, daß ein Team sowohl motiviert
MaxonPASCAL
192
als auch koordiniert arbeitet, könnte sich das modulare Programmieren theoretisch als nutz¬
bringend erweisen.
MaxonPASCAL bietet sogar zwei verschiedene Motlulkonzepte, die in gewissen Grenzen miteinan¬
der kombiniert werden können. Sie sind gekennzeichnet durch die Bezeichnung UNIT oder MODU-
LE. Zunächst wollen wir uns hier den iModulenn zuwenden, die für den Programmierer zwar etwas
schwieriger zu handhaben, aber in gewissem Sinne flexibler einsetzbar sind.
Ein MaxonPASCAL-Programm besteht, da wir vorerst davon ausgehen, daß wir keine Units verwen¬
den, immer aus einem Hauptprogramm und beliebig vielen Modulen. Jeder Teil ist nach dem
Compilieren als sog. Objektdatei abzuspeichern, damit der Linker ihn in die anderen Teile einbin¬
den kann. Das Hauptprogramm sicht wie gewohnt aus, während die Module mit „Module“ statt
„Program“ beginnen und keinen Anweisungsteil auf oberster Ebene haben. Die Verbindung der
Komponenten geschieht über gemeinsame Variablen und Procedures, die mittels der Directives
„IMPORU“ und „FJCPORT“ ausgetauscht werden.
Aller nun eines nach dem anderen:'
9.2 Syntax von Modulen
Betrachten w'ir als erstes ein kleines Beispiel, an dem das Prinzip des Linkens schon klar wird. Hier
ist ein Hauptprogramm:
Program Haupt;
Var 1:integer; EXPORT;
Procedure p(a:Integer); IMPORT;
Procedure q; IMPORT;
Function f(n:integer):integer; EXPORT;
Begin
f:= n*n
End;
Begin { Hauptprogramm }
P(20);
q
End,
Dieses Hauptprogramm importiert zw'ei Prozeduren, nämlich „p“ und „q“, und exportiert die
Funktion ..f" und die Variable „i“. Nun brauchen wir wenigstens noch ein Modul, das die importier¬
ten Procedures zur Verfügung stellt (es macht nichts, wenn die exportierten Bezeichner nirgendwo
benutzt werden). Hier ist ein solches Modul:
Moduls Unterprogramme;
Var i: integer; IMPORT;
9. Units und Module
193
Procedure p(k:integer); EXPORT;
Begin
i:= round(sqrt(k))
End;
Procedure q; EXPORT;
Function f(j:integer):integer; IMPORT; { lokale Funktion! )
Begin { von "q" )
writeln('Funktionswert von i, ' ist f(i))
End;
Begin { leerer Anweisungsteil )
End;
Zuerst zwei Anmerkungen zur Synt;ix: DaB die Direktiven „Import“ und „Expon“ hier groß gesclirie-
Iren wurden, hat (wie immer in PASCAL) absolut keine Bedeutung. Dies geschah nur, damit sie bes¬
ser auffallen.
Auf oberster Ebene, also da, wo sonst tias Hauptprrjgramm steht, hat das Modul einen leeren
Anweisungsteil. Er hätte auch - wie oben ei-wähnt - ganz weggelassen werden können. Auch haben
Sie die Wahl, ob Sie am Ende dieses Pseudo-Hauptprogramms einen Punkt, ein Semikolon (wie
oben geschehen) oder auch gar nichts setzen. Es ist nicht möglich, zwischen dieses „Begin End“
irgentlwelche Befehle zu setzen.
Die Syntax eines Moduls unterscheidet .sich davon einmal abgesehen also nicht von der eines
Programms:
"MODULE" Programmkopf
Deklarationstell
["BEGIN" [";"] "END" [";"l"."]]
Syntax fiir „Programmkopf':
Bezeichner [ "(" Bezeichner { "," Bezeichner } ")" ] [ ";" I
Man darf also auch hinter dem Motlulnamen (der keine Bedeutung hat) eine ParameterlLste wie
„(input,output)“ setzen - die dann ebenfalls keinerlei Bedeutung hätte.
Eine Prozedur wird imponiert, indem man ihren Kopf hinschreibt und anstelle eines
Prozedurblocks einfach ..Import“ schreibt. .Als Export wird sie definiert, indem man zwischen ihrem
Kopf und Rtimpf den Bezeichner „Export'' setzt. Ein- und ausgeiuhrte Variablen werden ganz normal
deklariert, nur daß hinter die jeweilige Deklarationszeile „Import“ bzw. „Export“ zu schreiben ist.
ln diesem Zusammenhang hat MaxonPascal eine kleine Verbesserung gegenüber Kickpascal 2: Eine
Prozedur, die bereits als „Import" deklariert wurde, kann später im Programm noch definiert wer¬
den. Sie wird dann exportiert.
MaxonPASCAL
194
Beispiel:
procedure p(i: Integer);
Import;
{ ... )
procedure p; { Parameterliste ist ja schon bekannt)
begln
{ ... }
end;
Wozu das gut sein soll?
Nun, dadurch können Sie jetzt in Pascal das Modulkonzept von C imitieren. Sie können in eine
Includedatei zunächst sämtliche globalen Funktionen als „Import“ deklarieren und diese Datei dann
in jedes Modul includieren. Dadurch sind automatisch alle globalen Funktionen in allen Modulen
bekannt und können dann an beliebiger Stelle „für den Export“ definiert werden.
Aber zurück zum Beispiel:
Das Flauptprogramm ruft als erstes die Prozedur „p“ mit dem Parameter 20 auf. Diese Prozedur wird
aus dem Modul importiert und initialisiert die Variable „i“, die sie wiederum aus dem Hauptmodul
importien hat. Die Prozedur „q“, die das Hauptprogramm als nächstes aufruft, importiert die
Funktion „f lokal, so daß sie nur innerhalb von „q“ bekannt ist. Es ist aber nicht möglich, umge¬
kehrt eine lokale Prozedur oder Funktion zu exportieren.
Es sei noch einmal daraufhingewiesen, daß ein Programm stets aus genau (!) einem Hauptprogram,
aber beliebig vielen Modulen besteht.
9.3 Objektdateien und Linkersteuerung
Wenn Sie die obigen Listings so von MaxonPASCAL compilieren lassen, ist der Compiler zwar einver¬
standen, aber der Linker meldet Fehler, weil die importierten Bezeichner nirgendwo definiert wer¬
den. Also müssen Sie ihm irgendwie .sagen, was er einlinken soll.
Dazu brauchen Sie zunächst einmal Objektdateien, für jeden Bestandteil des Programms einen.
Lassen Sie also das „Llnterprogramm'‘-Modul compilieren und ignorieren Sie die Linker-
Fehlermeldungen. Jetzt können Sie weder das Programm ausführen noch eine Exe-Datei schreiben
lassen. Eine Objektdatei kann man aber unabhängig vom Linker erzeugen lassen. Tippen Sie nach
dem Compilieren also „0“ (oder wählen Sie das entsprechende Pull-Down-Menü) und speichern Sie
die Objektdatei ab. Diese Datei enthält den Programmctxle des Moduls und .Angaben über die
deklarieren Bezeichner.
Laden Sie nun das Hauptprogramm. Jetzt müssen Sie dem Unker sagen, daß die zuvor erzeugte
Objektdatei dazu gehört, und zwar mit der Compiler-Anweisung „link“:
{$link 'paacal:modul.o'}
9. Units und Modulc
195
Diese Anweisung können Sie an eine beliebigen Stelle des Quelltextes von „Haupt“ setzen. Wenn
der Compiler auf diese Directive trifft (siehe dazu auch Kapitel „Compiler-Directives"), lädt er sofort
die entsprechende Datei. Es gibt dafür zwei naheliegende Positionen; Entweder nahe der Stelle, wo
die zugehörigen „Import“- Deklarationen stehen (ist übersichtlich, weil man dann sofort sieht, was
woher kommt) oder als allerletzte Zeile ganz am Programmende. Letzteres ist während der
Programmentwicklung praktisch, weil man in tler Regel immer wieder neue Compiler-
Fehlermeldungen verursacht, w'ährend man heim Linken eigendich nichts mehr falsch machen
kann, sobald Im-/Exporte erst einmal stimmen. Deshalb will man so schnell wie möglich wissen, ob
das gerade bearbeitete Modul syntaktische Fehler enthält und wird deshalb die Anweisungen zum
(bei Diskettenbenutzung erwähnenswerte Zeit erforderndes) Laden von Objektdateien ans Ende
.setzen, so daß sie erst ausgefuhrt werden, wenn sonst alles OK ist.
Wie dem auch sei, nun wird der Compiler irgendwann auf die Disk oder Platte zugreifen und die
genannte Objektdatei laden, Nach dem Cttmpilieren prüft der Hnker wieder, ob alle irgendwo (im
Hauptprogramm oder einem eingelinkten Modul) als Import deklarierten Bezeichner irgendwo
exportiert werden. Er gibt dann eine vollständige Liste aller Undefinierten Bezeichner aus oder,
wenn alles klar ist, „Ready“, ln letzterem Fall haben Sie ein lauffähiges gelinktes Programm vorlie¬
gen. Sie können es wie gewohnt stanen oder eine Exe-Datei eiv.eugen lassen.
Die Benutzung von „Hink“ ist nicht ganz problemlos, wenn Sie Ihre Programmdateien in ein ande¬
res Verzeichnis kopieren und dort neu compilieren wollen. Dann müssen Sie in jedem Quelltext vor
dem Übersetzen die Dateinamen in den Linker-Anweisungen von Hand ändern.
Cm das zu umgehen, bietet Ihneti „Hink“ iKX'h eine interessante Option: Wenn der Dateiname der
Objectdatei keinerlei Pfadangabe enthält (d. h. im Namensstring weder ein noch ein vor¬
kommt), wird der Pfad des Dateinamens der im Editor gehaltenen Datei vor den Objectdateinamen
gehängt (Sätze gibt's...), Beispiel: ln einem Quelltext namens „PASCAL:Sources/Chaos/Name.p'‘
taucht die .Anweisung {$link „Hilfsmodul.o" } auf Dann lädt der Linker die Objectdatei
„PASCAL:Sources/Chaos/Hilfsmodul.o“.
Dem Linker ist es übrigens, im Gegensatz zum Compiler, egal was ein Hauptprogramm und was ein
Modul ist. Der Compiler bringt ihm das bei, indem er das Hauptprogramm immer automatisch den
Bezeichner „_main“ exportieren und jedes Modul diesen Bezeichner importieren läßt. Dadurch ist
gewährleistet, daß ein Programm nur korrekt linkbar ist, wenn es einerseits mindestens ein
Hauptprogramm (sonst wäre der Bez.eichner „_main'' ja Undefiniert) und andererseits auch höch¬
stens ein Hauptprogramm enthält (sonst würde ein Doppel-Export von „_main" als Fehler gemel¬
det).
Dieses „_main“ markiert übrigens den Anfang des Hauptprogramms, und am .Anfang des Codes
jedes Moduls steht ein ,Jmp“ (das Äquivalent im Maschinensprache zum „Goto“ in PASCAL) zu eben
diesem Syanbol. Das hat dann wiederum die Konsequenz, daß Sie in obigen Beispiel auch
Hauptprogramm und Mtxlul vertauschen könnten, also erst ein Object-File des Hauptprogramms
erzeugen und es dann in das Modul einlinken lassen.
MaxonPASCAL
196
ln der praktischen Programmierung vvirci es sinnvoiierw'eise so ausselien, daß Sie Objekltlateien von
allen Modulen und vom llauptprogramm anlegen und dann den Quelltext mal der einen, mal der
anderen Komponente im Etiitor bearbeiten. Dabei enthält jeder einzelne Quelltcxt die Com|iiler-
Directives, die alle anderen Teile einladen, Wetin Sie jeweils einen Text verbe.ssert und ausgetestet
halxm und an einem anderen Programmteil Weiterarbeiten wollen, sollten Sie vor dem Latlen des
nächsten Quelltexts zuerst das Ergebnis Ihrer Arbeit als Objektdatei abspeichern. Das geht vom
Tastatumienii ja sehr bet|uem, wenn Sic sich an den vorgeschlagenen Dateinamen halten: Es kostet
Sie nur die beiden Tastendrücke „0“ und „Return“ - und natürlich, falls noch nicht geschehen, auch
noch die Taste „S“ zum Al»|X‘ichern der neuesten Version des Quelltextes,
Eine übjekttlatei enthält immer nur den (xKle des zuvor compilierten Programmteils, nicht etwa
auch die mit {$link } eingeladenen Codestücke <xler das MaxonPASCAL-latufzeitsystem. Sie brau¬
chen also beim oben Ixschriebenen Programmierablauf nicht zu befürchten, daß ein Teil im Code
doppelt auftaucht.
Seit .MaxonPascal 3 ist „Jlink" aber ziemlich ülxrflüssig, denn es gibt ja die Projektverwaltung
„Make“. ,,$link‘' wird im Make-Modus ignoriert.
9.4 Alink-Kompatiblität - Fluch und Segen
Der integrierte Linker von MtixonP.VSCAI, ist im wesentlichen zum AMIGA-Standardlinker ,Alink“
bzw. der PD-Version „Blink“ kompatibel, w'enn er auch einige weniger wichtige Features dieses
Linker-Standards nicht unterstützt. Dtts hat die erfreuliche Konsetjuenz, daß Sie probletnlos
Assembler-Routinen einlinken können (siehe übernächstes Kttpitel), denn fast alle AMIGA-
Assembler erzeugen Alink-kompatible Objektdateien. Aber es gibt auch einen Nachteil: Da der Alink
im Prinzip für alle Programmiersprachen verevendet w'ird, hat er keinerlei Vorstellung davtm, was
eine Prozedur oder eine Parameterliste ist.
Seine Arbeit beschränkt sich darauf. Bezeichner zuzuordnen: Wenn ein Bezeichner irgendwo
benutzt und anderswo tlel'tniert wird, trägt er an der ersten Stelle die entsprechende Adresse ein -
sonst nichts.
Das bedeutet für Sie als PASCAl.-Pmgrammierer. daß Sie .selbst auf die modulüberschreitende
Semantik achten müssen. Sie könnten zum Beispiel versehentlich in einem .Modul eine Variable
exportieren und in einem amleren Modul eine gleichnamige Prozedttr importieren. Eiy>ebnis: Der
Compiler weiß nichts über tiie anderen Module und meldet deshalb keinen Fehler, der Linker, der
keine Ahnung von P.ASC.M. hat, stellt hier eine Namensgleichheit fest. Zur laufzeit wird das
Prograitim dann mit einen Unterprogrammaufruf in einen Dtttcnbereich springen - ein Fall für den
Fxception-Handler.
Ein anderes Beispiel: ein Modul exportiert eine INTEGER-Variable (mit 2 Bytes Speichertxdarf), ein
anderes importiert diese als 4 Byte lange LONGINT-Variable. Wenn das importierende .Modttl nun
lesend auf die Variable zugreifi, ist das Eigebnis Undefiniert, und wenn es schreibend zugreift
(Wertzuweisung), wird über den für die INTEGER- Variable re.sertierten Bereich hinaus geschrieben
- mit unabsehbaren Folgen.
9. Units und Module
197
Auch ist es wichtig, claK beim Im- und Export von Prozeduren und Funktionen die Parameterlisten
der Import- und Export-Deklaration äquivalent sind - auch hier können Sie sonst „nette“ Übera-
schungcn erleben. Aus all’ dem folgt für Sie, daß Sie bei Im- und Exporten aller Art höllisch aufpas-
.sen müssen,
.Als PASC,Al,-Programmierer sind Sie es gewohnt, daß „Test“, „test“ und „TEST“ lediglich verschiede¬
ne Schreibweisen für den selben Bezeichner sind, denn in PASCAL ist die Groß-/Kleinschreibung ja
egal. Nun wurde der Alink ursprünglich Für C und Assembler geschrieben, und da ist (bei C immer,
bei den A.M1GA-Assembler meistens) die Schreiliweise eines Bezeichners signifikant. Folglich mag
der .Alink es nicht, wenn man eine Prozedur „Hallo“ exitortiert, aber „hallo“ importiert - für ihn sind
dies völlig verschiedene Bezeichner.
Das ist natürlich nicht schön. Deshalb hat der ins MtixonPASC.AL-System integrierte Linker eine
(Default-mäßig eingeschaltete) Option, die ihn veranlaßt, die Groß-/Kleinschreibung zu ignorieren.
Diese Option wird mit dem Pull-Down-Lintermenü „OptionemTinker“ geschaltet. Wenn man sie aus¬
schaltet („GUOSS/ddein beachten“ angewälüt), müssen die Bezeichner in der IMPOKT-Zeile genau so
wie in der EXPORT-Deklaratitin geschrieben w^erden - wie man ihn im Rest der Module schreibt, ist
Sache des Compilers und somit dem Linker egal.
Vielleicht fragen Sic sich jetzt, wanim es diese gegen alle lieben Gewohnheiten des P.ASCAI,-
Programmierers verstoßentle Option überhaupt gibt. Well, vielleicht haben Sie einmal das
Betlürlhis, Ihr Programm extern zu linken, z. B. im Zusammenhang mit der Einbindung von
,Assembler-Routinen. Dann will man keine bösen Überra.schungen erleben, .sondern schon in der
.MaxonPASCAL-Entwicklungsumgebung erfahren, ob der externe Linker später Fehler melden wird -
also sollte sich der .MaxonPASCAL-l.inkerdann genauso verhalten wie sein Kollege Alink.
9.5 Hunks
Dieser Abschnitt ist für den „normalen“ PASC.Al.-Programmierer nicht unlredingt nötig. Ich werde
hier die Einträge erklären, die plötzlich in der Speicherbelegungsliste auftauchen, wenn mit Units
oder Modulen gearbeitet wird.
AMIGA-Programmdateien - also z. B. die von Ma.xonPASC.AL erzeugten Exe-Dateien - sind in soge¬
nannten „Hunks“ organisiert. Es gibt im wesentlichen drei Hunktypen:
«w CODE: Ein solcher Hunk enthält lauffähigen Programmcode.
i«!' D.ATA; Hier können die Daten eines Programms liegen, ln Maschinencode gibt es aber keinen
prinzipiellen Unterschied zwischen Prognimm und Daten, so daß dieser Hunktyp eigentlich
mit „CODE“ identisch ist.
t«' BSS: Auch hier liegen Daten, aber solche, die beim Programmstart keinen definierten Inhalt
htiben. Ein BSS-Hunk ist deshalb eigentlich nicht mehr als eine .Anweisung an die Laderoutine,
Siteicher zu reservieren, in dem das Programm dann z. B. Variablen unterbringen kann.
MaxonPASCAL
198
Für kute, die gern in Hexdumps wühlen; Ein „CODE''-Hunk beginnt in der Datei mit dem Langwort
$0Ü0003E9, „DAIA“ mit I000003EA und die Kennung $ÜÜ0003EB steht für „BSS“. Das Langwort nach
der Hunk-Kennung enthält jeweils tlie Hunklänge in Langworten, danach kommt der Inhalt des
Hunks (außer natürlich bei „BSS“, der ja keinen definierten Inhalt hat). Hinter jedem Hunk kann
noch eine Relukationstabelle (Kennung: IÜ00003EC) stehen, die Angaben dazu enthält, wie der
Hunkinhalt zu modifizieren ist, um ihn an eine S|reicheradresse anzupassen ■ denn im AMIGA wird
ja grundsätzlich nicht mit festen Speicheradressen gearbeitet - und wie die Hunks verlrunden sind.
Bitte verwechseln Sie „Hunk“ nicht mit „Hrung“, zumal sowieso keiner weiß, w'as ein Hrung ist und
warum er gerade auf Beteigeuze 7 explodiert ist.
Was hat das Ganze mit MaxonPASCAL und Modulen zu tun? Nun, auch Objektdateien sind aus
Hunks aufgebaut, nur daß die Hunks zum Teil nicht über Relokationstabellen, sondern über
Verweise auf Bezeichner verbunden sind, so daß der Linker im wesentlichen die Aufgabe hat, glei¬
che Symbole zu verbinden und daraus Relokationstabellen zu erstellen.
9.6 Dynamische und statische Variablen
Normalerweise verwalten MaxonPASCAl,-Programme ihre Variablen auf dem Stack. Beim
Programmstart wird dort genug Platz für die globalen Variablen eingerichtet, und immer, w'enn eine
Prozedur oder Funktion aufgerufen wird, reserviert sie sich als erstes die benötigte Menge Speicher.
Durch dieses Variablenkonzept ist es möglich, daß jede Schachtel einer rekursiven Prozedur ihre
eigenen Variablen hat.
Der Compiler berechnet, wieviel Stack das Programm ohne Rekursion maximal (d. h. zum Zeitpunkt
der maximalen Schachtelungstiefe) braucht, und gibt diesen Speicherbedarf als „Linear stack requi-
remenf aus.
Daneben gibt es noch ein weiteres Variablenveroaltungskonzept: Statische Variablen. Solche
Variablen liegen in einem BSS-Hunk, sind al.so Bestandteil der Exe- oder Objektdatei und werden
somit schon beim Laden des Programms eingerichtet. Jede statische Variable existiert dadurch
immer genau einmal, auch lokale Variable einer rekursiven Prozedur.
Exportierte Variable sind immer statisch, denn der Linker muß ja .schon nach dem Compilen wissen,
w'o sie zur laufeeit im Speicher liegen, was bei tlynamisch auf den Stack geiegten Variablen natürlich
nicht möglich wäre. Ferner sind die „globalen“ Variablen in Modulen (also die Vaiiablen, die dort
außerhalb einer Prozedur oder Funktion deklariert werden), stets statisch. Gnjnd: Um sie auf dem
Stack zu verwalten, müßte jedes Modul zur Compilezeit „wissen“, wie viel Platz alle anderen Module
für ihre Variablen braucheruund wo noch Platz für die eigenen frei ist.
Von diesen inhärent statischen Variablen merken Sie in der Regel nichts, außer, daß die
Speicherbelegungsliste einen entsprechend großen BSS-Hunk ausweist oder daß Sie
Schwierigkeiten bekommen, falls Sie auf die Idee kommen sollten, eine lokale Variable einer rekur¬
siven Prozedur zu exportieren. Sie können Variablen aber auch bewußt als statisch deklarieren; mit
der Directive „STATIC“. Sie wird genau wie „import“ oder „Export“ hinter die Variablendeklaration
gesetzt, z, B, so:
9. Units und Module
199
Program Statisch;
Var v: integer;
Procedure p(£lag: Boolean);
Var v: integer; STATIC;
Begin
If flag Then v:= 26731
Else writeln(v)
End;
Begin
v;= 42;
p (true);
p (false);
writeln (v)
End.
Dieses Programm erzeugt die Ausgabe;
26731 42
Wie funktioniert es? Die Prozedur „p" hat eine lokale Variable „v“, die nichts mit der gleichnamigen
globalen Variablen zu tun hat. Beim ersten Aufruf mit dem Parameter „true“ wird diese lokale
Variable mit dem Wert 26731 initialisiert. Dadurch aber, daß „v“ statisch ist, existiert cs nach dem
Ende der Prozedur weiter und hat beim zweiten Aufnif immer noch den selben Wen - andernfalls
wäre er Undefiniert.
Die globale Variable „V habe ich im Beispiel eingeführt, um zu zeigen, daß das statische „v“ zwar zur
gesamten Laufzeit existien, aber trotzdem nicht global ist.
Übrigens: Wenn Sie das „STATIC“ wegließen, würde sich in diesem Fall nichts an der Ausgabe
ändern, denn zur dynamischen Erzeugung des lokalen „v" wird immer derselbe Speicherbereich
benutzt. Zwischen den beiden Aufrufen von „p“ wäre dieser Speicher aber ungeschützt und akut
überschrcibgefährdet.
9.7 Externes und internes Linken mit „PasLib.o"
Auf Ihrer MaxonPASCAL-Disk finden Sie eine Datei „paslib.o“. Sie enthält das gesamte
Laufzeitsystem von MaxonPASCAl., also eine Sammlung von Unterprogrammen wie z. B. Ein- und
Ausgateoperationen aller Art, die dem PASCAJ.-Programmierer zur Verfügung stehen, der Prozessor
ater nicht ohne weiteres selbst kann. Beispielsweise ist eine .Addition zw'eier Integer-Zahlen als ein
einziger Maschmensprachbefehl zu realisieren, während die Ausgabe einer solchen Zahl eine sehr
komplexe Operation und nur als ein längeres Unterprogramm realisierbar ist.
Ein identisches Laufzeitsystem ist integrierter Bestandteil des MaxonPASCAL-Systems, so daß der
Linker es ohne Diskettenzugriff mit dem vom Compiler erzeugten Ctxle und den evil. zugeladcnen
Mcxlulen zusammenbinden kann. Die Datei „paslib.o“ brauchen Sie deshalb nur, wenn Sie einen
MaxonPASCAL
200
anderen als den integrierten Linker benutzen, z. ü, um mit dem MaxonASS eine Assembler-
Lnterroutine zu schreiben und aus dem MaxonASS-System heraus zu debuggen (mehr dazu im fol¬
genden Abschnitt).
Sie können auch „einfach mal so extern linken: besorgen Sie sich „BLink“, erzeugen Sie zu einem
RVICU-Programm eine Objektdatei, z. B. „helio.o", und tippen Sie im CU:
BLink helio.o, paslib.o to Hello
Auf diese Weise erhalten Sie aus der Objekt-Datei eine lauffahige Exe-Datei. Nun benötigt wohl kein
einzelnes Programm sämtliche Möglichkeiten, die MaxonPASCAL bietet. So wird man in der Regel
entweder „REAL“ cxler ..LONGREAl.“ benutzen, nicht aber beide Zahlenformate durcheinander - falls
man überhaupt Fließkomma-Operationen braucht. Um in Exe-Files nicht zu viel unnützen Code ste¬
hen zu haben, ist das ca. 10 KByte große MaxonPASCAL-Laufzeitsystem in mehrere „Bibliotheken“
unterteilt: Zum einen wäre da die knapp 4 KByte umfassende Grundlibrary. Somit gibt der Linker
immer eine ..Maximum Code Size“ von wenigstens 3900 Byte aus. Diese Bibliothek enthält im
wesentlichen die wichtigsten Ein-/Ausgabeoperationen, die Initialisierungs- und die Endprozedur,
welche am Anfang bzw, Ende des Programms aufgerufen werden, die meisten laufzeit-
Fehlermeldungen und so fort. Sie exportiert zum Linker das Symbol „_paslibbase“, das ihre
Basisadre.sse enthält.
Oberhalb dieser Adresse, die am Programmanfang ins Proze.ssorregister A5 geladen wird und dort
unverändert stehen bleiben muß, stehen verschiedene wichtige Daten wie z. B. der „Global Vector",
über den MaxnnPASCAI. die Stack-Variablen verw'altet; unterhalb der Basis steht eine Sprungtabelle
zu den einzelnen Funktionen,
Außerdem gibt es noch sechs weitere, nach „Themen“ geordnete Bibliotheken, die ebenfalls jew-eils
ihre Basisadresse exportieren:
_reallibbase; Fließkommaoperationen, einfache Genauigkeit
_doublelibbase: Fließkommaoperationen, doppelte Genauigkeit
_setlibbase: alle SET-Operationen
_stringlibbase: größere Stringoperationen wie „-f“, „Insert“ usw.
_misclibbase: diverses, z. B. „Random“, „Hi“, „CIrEoL“,...
_amigalibbase; AMIGA-spezifisches (Windows, Messages, Console...)
Welche Konsequenzen hat das fiir Sie als PASCAL-Programmierer? Zum einen dürfen Sie die oben
genannten Bezeichner (und „_main“) nicht aus PASCAL-Modulen exportieren, denn sonst kommt
es zu Konflikten.
Wichtiger ist aber, daß der interne Linker nur die Bibliotheken des bufzeitsystems einbindet, aus
denen auch Funktionen benutzt w'erden, während man bei externem Linken nur die Möglichkeit
bat, alles einzuhinden.
9. Units und Module
201
9.8 Units
Das Unic-Konzept ist eine sehr leistunsslaltige Füim der modularen Programmierung. Hier werden
Compiler und Linker durch spezielle Sprachkonstrukte näher aneinander gebunden, wodurch \iele
Fehlermoglichkeiten, die es hei den MODULEn gilx, ausgeschlossen werden, AulSerdem bieten
Units eine bequeme Möglichkeit, den Sprachumläng von MtixonPASCAL durch Anlagen von Unit-
Bibliotheken nahezu beliebig zu erw'citern.
9.8.1 Ein erstes Beispiel
.Analog zu den MODULEn besteht ein MtwonPASCAL-Programm aus einem Hauptprogramm und
beliebig vielen Units. Hier ist ein erstes Beispiel für ein Unit:
UMIT Beisplell;
{ Ein tJnit beginnt mit dem Schlüsselwort "UNIT", gefolgt vom
Unitnamen. Während Programm- und Modulnamen bedeutungslos sind,
werden die Unitnamen für mehrere Zwecke benötigt, so daß man
sie sinnvoll wählen sollte. }
INTERFACE
{ Ein Unit besteht im wesentlichen aus zwei Teilen: dem
"öffentlichen" (also dem Hauptprogramm und anderen Units
zugänglichen) Interface-Teil, und dem "privaten" (für andere
Programmteile verborgenen) Implementation-Teil. )
TYPE Natuerlich = 0..Maxint;
{ Dieser Datentyp wird im Interface-Teil des Units "Beispiell"
definiert und steht damit allen Programmen, die dieses Unit
benutzen, zur Verfügung. )
VAR Grenze: Natuerlich;
{ Dies ist eine Variable des Units "Beispiell" )
PROCEDURE Eingabe (VAR Zahl: integer);
{ Diese Prozedur wird vom Unit "Beispiell" exportiert. Im
Interface-Teil steht nur ihr Prozedurkopf, der "Rumpf"
folgt im Implementationsteil. )
FUNCTION IstPrim (n: Natuerlich): Boolean;
{ Auch diese Prozedur wird von diesem Unit exportiert. )
IMPLEMENTATION
{ Hier beginnt der zweite, nicht-öffentliche Teil des Units. Er
enthält die Rümpfe der im Interfaceteil deklarierten Prozeduren
und Funktionen sowie alle Bezeichner dieses Units, die nicht
exportiert werden sollen. }
FUNCTION Teilbar (a, b: Natuerlich): Boolean;
MaxonPASCAL
202
{ Diese Funktion gibt an, ob a durch b teilbar ist. }
BEOIH
Teilbar:= (a MOD b = 0)
END;
FUNCTION IstPrim;
{ Jetzt kommt der Rumpf dieser im Interfaceteil deklarierten
Funktion. Beachten Sie, daß der Funktionskopf hier keinerlei
Parameter und keinen Ergebnistypen enthält, denn das vnirde
alles ja schon im Interfaceteil definiert.
Die Funktion soll ermitteln, ob die natürliche Zahl "n“ eine
Primzahl ist. )
VAR Zaehler: integer;
BEGIN
Zaehler:= 2;
WHILE (Zaehler < n DIV 2) AND NOT Teilbar(n, Zaehler) DO
Zaehler:= Zaehler+1;
IstPrim:= NOT Teilbar(n, Zaehler)
END;
PHOCEDDRE Eingabe;
{ Auch hier wird die Parameterliste nicht noch einmal geschrieben )
BEGIN
Write{'Bitte eine Zahl eingeben: ');
Readln (Zahl)
END;
END. { Dies ist das Ende des Units. )
Wenn der Compiler dieses Unit fehlerfrei übersetzt hat (hier können Sie es ignorieren, wenn der
Linker Fehler meldet, denn ein Unit kann man sowieso nicht direkt starten), legt er automatisch
zwei Dateien an: Die Objectdatei „Beispiel!,o“, die wie bei Modulen den von Compiler erzeugten
Code des Units enthält, und die Interface-Datei „Beispiel!.u“. Darin steht in vorcompilierter Form
eine Kopie des Interface-Teils des Units.
Aber wohin werden diese Dateien geschrieben? Im Pull-Down-.Menü „Optionen“ finden Sie den
Menüpunkt „Suchpfade“. Wenn Sie diesen mit der Maus anwählen, erscheint ein kleines Fenster mit
je zwei Textgadgets für IncludefUes und für Unit-Dateien. Hier interessieren uns nur die beiden
Zeilen unter „Unit“.
Falls Sie nur die erste Zeile benutzen, ist alles einleuchtend: Dann werden die beiden oben genann¬
ten Dateien in dieses Verzeichnis geschrieben. Wenn Sie zwei Pfade angeben, wird wieder derselbe
raffinierte Trick wie bei den Include-Files angewendet: Die Dateien werden doppelt erzeugt, und
zwar in den beiden angegebenen Verzeichnissen. Nun werden die Dateien ja nicht „einfach so“
erzeugt, sondern sollen auch irgend wann einmal gelesen werden (dazu später mehr). Zuerst sucht
das PASCAL-System im ersten und dann im zweiten angegebenen Verzeichnis nach den Dateien.
Wenn sie nur im zweiten Verzeichnis gefunden werden, werden sie ins erste umkopiert (nicht
umgekehn!). Also können Sie als ersten Pfad ein Untei-verzeichnis in der schnellen RAM-Dlsk und
als zweiten ein Dhectory auf Ihrer Festplatte bzw. PASCAL-Arbeitsdiskette wählen. Bequemer Lst es
9. Units und Module
203
natürlich, wenn Sie die Pfade nicht nach jedem Start des MaxonPASCAL-Systems neu eintragen, son¬
dern mit dem Programm „PASCAI.Prefs“ die richtige Einstellung in Ihr Config-File eintragen.
Übrigens werden bei der Unit-Handbabung wie beim lüden von Includefiles Unterv'erzeichnisse bei
Bedarf vom PASC.ALsystem automati.sch erzeugt.
9.8.2 USES
Nun haben wir also ein Unit in Form von zwei bzw. vier Dateien vorliegen. Jetzt können wir es ganz
einfach in einem unserer Programme benutzen, z, B. so:
PROGRAM Primzahl)
USES BelBplell;
VAR i: Natuerlich;
BEGIN
Eingabe (i);
IF IstPrim (i) THEN
Writeln (i, ' ist prim.')
ELSE
Writeln ('Keine Primzahl.')
END.
Sobald der Compiler auf die „USES‘'-.Anweisung trifft, liest er die Datei „Beispiell.u“ wie ein Indude-
File ein. Dadurch stehen im folgenden die Bezeichner „Natuerlich“, „Grenze“ (wird hier nicht
benutzt), „Eingabe“ und „IstPrim“ zur Verfügung. Dabei werden Variablen, Prozeduren und
Funktionen automatisch als „Import" behandelt.
Außerdem veranlaßt die USES-Anweisung den Compiler, zum Schluß noch die Datei „Beispiel.o“
einzuladen.
9.9 Units - Alles noch 'mal etwas genauer
9.9.1 Syntax
Ein Unit beginnt immer mit dem Wort „UNIT“, gefolgt vom Unit-Namen, der ein Bezeichner ist.
Dahinter beginnt automatisch der Interface-Teil. Sie können dies dadurch deutlich machen, daß Sie
das Wort „Interface“ schreiben. Dies kann aber auch ersatzlos entfallen.
Danach können USF.S-Zeilen folgen, denn ein Unit kann selbst wieder andere Units benutzen. Diese
Zeilen haben folgende Syntax:
ases-Deklaration= { [ "FROH" Bezeichner ] "USES" Bezeichner {
Bezeichner } ";" }
MaxonPASCAL
204
Ein Beispiel;
0SES Intuition, Graphics; USES Beispiel!;
Was es mit dem „FROM“ auf sich hal, werde ich später verraten.
Nun folgt der Rest des Interface-Pans, Hier kann folgendes Stehern
• Konstanten
• Datentypen
• Variahlen
• I.ibrarys
• Prozedur- und Funktionsköpfe
Wie üblich sind Sie an keine feste Reihenfolge gebunden, Inbels können hier nicht deklariert wer¬
den.
,\lso hat der Interfaceteil eines Units die.se Syntax:
Interfaceteil =
[ "INTERFACE"] Uses-Deklaration { Konstantendefinition |
Typdefinition | Variablendeklaration | Librarydeklaration |
Prozedurkopf | Funktionskopf }
Intern behandelt der Compiler die hier deklarierten Funktionen und Prozeduren wie FÜRW'ARD-
Deklarationen. Sie können aber auch als EMPÖRT bzw. EXTERNM. deklariert werden, aber nicht als
EXPORT, denn sie w'erden ja sowieso exportiert.
Mit tiem Wirrt ..IMPLEMENTATION“ beginnt dann der andere Teil des Units. Er ist wie ein nonnaler
Deklarationsteil eines Blocks aufgebaut und endet entweder mit einen „END“ oder dem
Initialisieiirngsteil (dazir später mehr). Ms letztes darf (I) ein Punkt txler ein Semikolon stehen:
Implementationsteil =
"IMPLEMENTATION" Deklarationsteil ("END" | Anweisungsteil) |
";" ]
Damit hätten wir auch .schon die vollständige Synuix für ein Unit:
Unit = "UNIT" Bezeichner [ ] Interfaceteil Implementationsteil
Im Implementationsteil müssen alle Prozeduren und Funktionen, deren Kopf im Interfaceteil dekla¬
riert wurde, definiert werden. Die Reihenfolge der einzelnen Prozeduren ist dabei egal. Hier besteht
ihr Kopf aber nur noch aus dem Schliissselwort PROCEDl.iRE bzw. FUNCTION und dem Namen, die
Parameterliste muß (und darf) nicht noch einmal angegelren werden.
9. Units und Modulc
205
9.9.2 Units und Module
Units können von Programmen, Modulen und anderen Units mittels USES aufgerufen werden. Zwei
oder mehr Units dürfen sich aber nicht gegenseitig aufrufen. Es besteht also teilweise eine .'\rt
Hierarchie unter den Units eines Pi-ognimms, während MODULEs als gleichrangig behandelt wur¬
den.
Ein Llnit-Aufmf aus einem MODULE könnte so au.sselien:
Module Modul;
Uees Crt;
Procedure Ausgabe; Export;
Begln
writelnt'Hallo!');
delay(50)
End;
Begin End { Ende des Moduls )
Dieses Modul benutzt also das Standard-linii „Crt“, das liesondere Prozeduren und Funktionen Rir
die Bildsdürm-Ein-./Ausgabe definiert. Ein geeignetes Hauptprogramm zu diesem Modul könnte wie
folgt aussehen;
Program Haupt;
üses Crt;
Procedure Ausgabe; Import;
Begin
Ausgabe
End.
{$link "Modul.o" }
Obwohl das Hauptprogramm das Unit „Crt“ nicht direkt benutzt, muß in diesem Fall die entspre¬
chende USES-Anweisung gesetzt werden. Dadurch weiß der Compiler, daß er den Code dieses Units
laden und dessen Initialisierungsteil (dazu später mehr) aufrufen muß.
Wenn Sie die neue ProjekO'erwaltung „Make“ venvenden, müssen Sie alle Units, die irgendwo im
Projekt benutzt w'erden, in das Uadget „Make-Units“ des Comirilerrequesters eintragen, damit der
Linker weiß, was er laden muß.
MaxonPASCAL
206
9.9.3 Schachtelung von USES-Aufrufen
Nun wollen wir uns noch ansehen, was genau der Compiler beim Aufruf von Units macht. Dazu
betrachten wir einige Sourcefragmente:
üilit A;
Interface
{ Definitionen von Unit A }
Implementation
End.
Unit B;
Interface
Uses A;
{ Definitionen von Unit B }
Implementation
End.
Unit C;
Interface
Uses B;
{ Definitionen von Unit C )
Implementation
End.
Unit D;
Interface
Usee C,A;
{ Definitionen von Unit D }
Imp 1 ement at ion
End.
Program Hauptprogramm;
Uses B,D;
Begin ( Hauptprogramm )
End.
Als erstes müssen wir hier das Unit A compilieren, da alle anderen Programmteile direkt oder indi¬
rekt davon Gebrauch machen. Das Unit B benutzt nur Unit A und kann also direkt danach übersetzt
werden.
Erst jetzt kann Unit C compiliert werden. Dabei geschieht folgendes; Durch „Uses B" wird der
Compiler angewiesen, den Interface-Teil von Unit B zu übersetzen. Dort steht als erstes „Uses A“, so
datl auch noch der Interfaceteil von Unit A und erst dann der Rest vom Interface des Units B gelesen
wird. Dann wird das Unit C zu Ende übersetzt, wobei dem Compiler die Interface-Deklarationen der
Units A und B bekannt .sind.
Interessant wird es nun beim Unit D, das erst C und dann A mittels „Uses“ benutzt. Zuerst wird Unit
C aufgerufen, welches Unit B, das wiederum Unit A benutzt, voraussetzt. Es werden durch die
.Anweisung „Uses C“ also nacheinander die Interfaceteile von A, B und C (in dieser Reihenfolge)
9. Units und Module
207
gelesen. Nun geht es weiter im Unit D; es soll zusätzlich noch Unit A benutzt werden. Nun merkt
der Compiler aber, daß A sch(rn gelesen wurde und liest es deshalb nicht noch einmal. Somit ist
„Uses A“ hier überflüssig. (Es hat aber doch eine Wirkung: Das Unit A wird an die erste Stelle der
Unit-Liste gesetzt, was wichtig sein kann, wenn mehrere Units gleichlautende Bezeichner definieren.
Dazu im nächsten Abschnitt mehr.)
Zuletzt betrachten wir noch das Hauptprogramm. Es benutzt die Units B und D und damit - wie wir
bereits wissen - indirekt auch die beiden anderen. Zuerst liest es also das Unit A, um B lesen zu kön¬
nen. Bevor danach D ge-used wird, muß nur noch C gelesen werden, denn A und B sind ja bereits
bekannt. Die Reihenfolge der benutzten Units ist also A-B-C-D, genau die selbe, als wenn man im
Hauptprogramm nur „Uses D“ geschrieben hätte. Somit ist die „Uses B"-Anweisung hier völlig über¬
flüssig.
9.10 Bezeichner-Handhabung in Units
Units sind wunderbar dazu geeignet, den Befehlsumfang von MaxonPASCAI. den eigenen
Bedürfnissen entsprechend zu erweitern: Man schreibe sich ein Unit mit den neuen Prozeduren,
Funktionen, Datentypen etc. und übemetze es einmal - schon kann man es in jedes Programm mit
einer einzigen USES-Anweisiing einbinden und hat die exportierten Bezeichner dieses Units zur
Verfügung. Man kann sogar Units an andere Programmierer weitergeben (sogar verkaufen...), ohne
die Quelltexte herausgeben zu müssen: es genügt, wenn der Benutzer die Dateien „MeinUnit.u“
und „MeinUnit.o“ liekommt.
Stellen Sie sich aber einmal folgendes vor: Von einem Freund halren Sie ein Unit „Matrix" bekom¬
men, das Prozeduren für Matrixoperationen enthält. Auf einer PD-Diskette fanden Sie ein Unit
„LongMath“, das Prozeduren für das Rechnen mit beliebig großen natürlichen Zahlen definiert. Da
Sie ein Mathematik-Frerak sind, wollen Sie nun in einem Programm beide Units benutzen. Beim
Durchlesen der Dokumentationen zu den lieiden Units erschrecken Sie: beide Units definieren eine
Prozedur oder Funktion namens „Mult", nämlich für die Multiplikation von Matrizen bzw. langen
Zahlen. Was sollen Sie jetzt tun, zumal Sie von keinem der Units den Quelltext haben, die Namen
der Prozeduren also nicht ändern können?
Ich kann Sie beruhigen: das Ganze ist kein l’roblem, denn Units dürfen ohne weiteres identische
Bezeichner exportieren. Sie können die beiden oben genannten Units also etwa so in Ihr Programm
einbinden:
PROQRAM Mein_geniales_Mathematilcprograniin;
USES Matrix, ( Geschrieben von Kasimir Müller, Juli 1990 )
LongMath; { Gefunden auf der PD-Dlsk "Quickstart #0815" )
Nun bezieht sich der Bez.eichner „Mult" auf das als letztes geladene Unit, also „LongMath“. Das ist
natürlich noch immer nicht schön, denn im Zweifelsfall wollen Sie in Ihrem Programm sowohl
Matrizen als auch große Zahlen multiplizieren. Dafür gibt es in .MaxonPASCAL ein besonderes
Sprachkonstrukt; Qualifizierte Bezeichner.
MaxonPASCAL
208
Rill Bezeichner wird ..qualifiziert“, indem man ihn den Namen de.s lJnit,s, in dem er definien wird,
voranstellt - mit einem Punkt getrennt. Also können Sie in „Ihrem genialen .Mathematikprogramm“
mit „Matrix.Mult ‘ und „Longkiath.Mult" gezielt auf die beiden Prozeduren zugreifen.
Globale Bezeichner von Programmen können dunii Voranstellen de.s Programmnamens „qualifi¬
ziert“ werden, und die vordefinierten Standardtezeichner von MaxonPASCAl. bilden ein Pseudo-
Unit namens „System . Also kann man durch selbstquälerische Qualifizierungen sogar
Standardbezeichner iiberdefinieren und trotztlem benutzen, wie es im folgenden Beispiel mit der
Prozedur „Writeln“ geschieht:
PROGRAM Qual;
VAR Writeln: integer;
BEGIN
Qual.Writeln:= 42;
System.Writeln(Qual.Writeln)
END.
Es dürfte problemlos konsensfähig sein, daß qualifizierte Bezeichner nicht gerade das Gelbe vom Ei
sind, zumal sie zusätzlichen Sebreibaufwand erfordern, was Freaks sowieso vermeiden, w'o sie nur
können. Deshaib .sollten sie eine Notlösung in Fällen wie dem oben beschriebenen sein, während
man bei selbstgeschriebenen Units darauf achten sollte, daß die e.xportierten Bezeichner nicht mit
denen anderer Units kollidieren.
Für l£ute, die alles ganz genau wissen wollen, soll jetzt noch erläuten werden, wie der Linker mit
Units umgeht. Bekanntlich legt der Compiler für jedes Unit zwei Dateien am Die Interface-Datei mit
der Endung „.u“ und die Objektdatei, zu erkennen an der Endung „.o“.
Erstere wird von Compiler gelesen, sobald er auf eine entsprechende USES-Anweisung stößt, letzte¬
re wird an.schließend vom Linker in das Ilauptprogramm eingebunden. Dabei werden wie bei den
-Modulen Bezeichner an den Linker übergeben, und zwar alle Namen der Variablen, Prozeduren und
Funktionen des Imerfaceteils - die dort definierten Konstanten, Datentypen und libraty's sind ja nur
für den Compiler von Interesse.
Wenn Sie die Kajütel über Module aufmerksam gelesen haben, wissen Sie vielleicht noch, daß der
Linker dopjielte Deklarationen gleichnamiger Bezeichner als Fehler meldet. Dagegen können, wie
oben beschrieben, verschiedene Units durchaus (lensellx;n Bezeichner exponieren. Um dieses
Problem zu umgehen, werden die Bezeichner „tiualifizien“ an den Linker übergeben. Im obigen
Beispiel (dem „genialen“ Matheprogramm) heißt das, daß an den Unker die beiden Bezeichner
„.Matrix..Mult“ und „Long.Math.Muh“ übergeben werden.
Bekanntlich können Sie über ein Pull-Down-Menü einstellen, ob der Linker die Groß-
/Kleinschreibung von Bezeichnern beachten soll. Falls Sie nun den weniger toleranten Modus
wählen, können Sie eine Üterraschung erleben, wenn Sie in der Uses-Zeile die Unitnamen falsch
schreiben, z. B. „USES matrix“: Der Compiler erfährt dann zwar aus dem Interläcefile, daß die zu
importierende Prozedur „Mult“ heißt, glaubt aber fälschlich, das Unit heiße „matrix". Also wird ver-
9. Units und Module
209
sucht, in das Hauptprogramm den Bezeichner „matrix.Mult“ zu imponieren - exponiert wird aber
lediglich der Name „Matrix.Mult“. ,\lso meldet der Hnker einen Undefinierten Bezeichner.
,\us demselben Grunde ist es auch nicht möglich, einem coin|)iliert vorliegenden Unit einen ande¬
ren Namen zu geben: Sie können zwar auf der Diskette die Dateien umbenennen, enx'a von
„Matrix,*" in „Mat,*", und diese Units dann mit „LISES Mat“ benutzen. Die in der Datei „Matrix.o“
exportierten Bezeichner tragen aber weiterhin Namen wie „Matiix.xxx“, während Ihr Programm nun
„Mat.xxx" importieren will. Ergo meldet der l.inker massenhaft Fehler.
9.11 Initialisierung und andere Spezialitäten
9.11.1 Initialisierungs-Prozeduren
In der formalen Syntax von Units wurde bereits angedeutet, dalS man Units mit so etwas wie einem
Hauptprogramm versehen kann.
UNIT Beispiel2;
INTERFACE
VAR n: integer;
PROCEDÜRE Ausgabe;
IMPLEMENTATION
PROCEDÜRE Ausgabe;
BEGIN
Wrlteln ('n = ', n)
END;
BEGIN { Initialisierungsteil )
Write (’n wird initialisiert: ');
n:= 99;
Ausgabe
END.
Ein Hauptprogramm dazu könnte so aussehem
PROGRAM Haupt2;
USBS Beispiel2;
BEGIN
n:= n+1;
Write('Neuer Wert von n: ');
Ausgabe
END.
MaxonPASCAI.
210
Das Unit hat also am Ende einen gloltlalen Anweisungsteil, der mit einem „END" endet (sonst enden
Units ja mit einen „END“ ohne vorangehenden Anweisungsteil). Diese Anweisungsfolge wird der
Initialisietungsteil des Units genannt und automati.sch vor dem Start des Hauptprogramms, das die¬
ses Unit benutzt, ausgeführt.
Also erzeugt unser kleines Programm folgende Au.sgabe;
n wird Initialisiert: n = 99
Neuer Wert von n: n = 100
Intern wird das so gehandhabt, daß der Init-Teil als Prozedur mit dem qualifizierten Namen „ init“
an den Unker exportiert wird, in unserem Beisiriel also „Beispiel2.Jnit“. Deshalb können s7e im
Interfiiceteil eines Units keine Prozedur, Funktion oder Variable mit dem Namen „Jnif deklarieren,
denn dann würde der Linker ja eine Bezeichnerkollision feststellen und als Fehler melden.
Der Aufruf von Initialisierungsteilen erfolgt im Zweifelstall genau ,so, wie man sich das wünscht. Ich
möchte nur deshalb genauer darauf eingehen, damit Sie nicht sagen können, das sei nirgendwo
dokumentiert:
1 . Der Initialisierungsteil jedes direkt oder auch indirekt benutzten Units eines Programms wird
genau einmal aufgerufen, auch dann, w'enn ein Unit mehrfach benutzt wird (indem es von meh¬
reren benutzten Units ge-used wird).
2. Benutzt ein Unit A ein anderes Unit B, so sorgt MaxonPASCAL dafür, daß in jedem Fall der
Inidalisierungsteil von Unit B vor dem von Unit A aufgerufen wird. Sie können also beim
Programmieren eines Init-Teils davon ausgehen, daß alle Units, die Sie in Ihrem Unit benutzen,
bereits initialisiert sind.
3. Von 2. einmal abgesehen, werden Units in der Reihenfolge winitialisiert, in der sie in der USES-
Anw'cisung stehen.
9.11.2 Prüfsummen
Wie Sie bereits wissen, wird der Compiler durch eine USES-Anweisung veranlaßt, die Interface-Datei
des entsprechenden Units zu lesen. Dort erfahrt er, welche Bezeichner in das gerade übersetzte
Unit oder Programm importiert werden, und vor allem auch, welche Bedeutung diese Bezeicher
haben. So weiß er nach „USES Beispiel2“ (siehe oben), daß „n“ eine Integer-Variable und .Ausgabe“
eine Prozedur ohne ParameteriLste ist. Mit diesem Wissen ward nun der Rest des Programms über-
setzt. So weil, so hoopy. Aber jetzt kommt’s:
UNIT A;
VAR n: Longint;
IMPLEMENTATION
BEGIN
9. Units und Module
211
n:= 26731
END.
Dieses kleine Unit werde nun von einem zweiten benutzt;
UNIT B;
USES A;
PROCEDÜRE Ausgabe;
IMPLEMENTATION
PROCEDURE Ausgabe;
BEGIN
Writeln(n)
END; ,
END.
Dies alles ist ncMth völlig klar und einsichtig: Das Unit exportiert eine Prozedur, die eine vom Unit
,A“ imponierte Urnglnt-Variable ausgibt. Aber jetzt (die Spannung steigt ins Unerträgliche...) kommt
das Hauptprogramm dazu;
PROGRAM C;
USES B;
BEGIN
Writet'Wert von n: ');
Ausgabe
END.
Auch jetzt haben wir noch nicht den springenden Punkt erreicht. Der kommt erst, wenn wir das
Unit ,A“ ändern; Wir deklarieren die Variable „n“ im Interface-Teil nicht mehr als Longlnt, sondern
nur als einfaches Integer, und compilieren dieses Unit mit dieser Änderung.
Und nun (und damit wären wir endlich beim Thema) versuchen wir erneut, unser Hauptprogramm
zu übersetzen.
„Na und?“
Das hüpfende Komma (oder so ähnlich) ist, daß das Unit .,B'' nach der Änderung von ,A“ noch nicht
wieder neu übersetzt wurde. Ergebnis: der vom Compiler erzeugte Maschinencode jenes Units
giaubt immer noch, „n“ sei eine Longlnt-Variable. Resultat; Die Prozedur .Ausgabe“ liest ein
Langwon (Longlnt = 4 Bytes) aus dem Speicher und gibt es aus, obwohl dort nur ein Wort (Integer
= 2 Bytes) für die Variable reserviert und initialisiert sind. Ergebnis; Es wird ein Undefinierter (also
im Zw'eifelsfall unsinniger) Wert ausgegeben, und Sic werden bei der Suche nach dem vermeintli¬
chen Bug halb wahnsinnig (falls wir einfach ‘mal so tun, als ob die Units und das Hauptprogramm
jeweils so ungefähr tausend Zeilen lang und entsprechend unübersichtlich wären).
MaxonPASCAL
212
Aller keine Panik: das Ganze passiert nämlich absolut NICHT! MaxonPASCAL ist clever genug, das
Problem zu erkennen, und meldet heim Compilieren des Programms „C“ in der ÜSES-Zeilc:
Checksum Error: Unit "B" using different "A".
Alles klar: Das Unit „B“ benutzte, als es compiliert wurde, ein Unit ,A“, das sich von dem jetzt vorlie¬
genden unterscheidet. Nun wssen wir also, daß das Unit „B” neu compiliert werden muß. Am
betiuemsten benutzt man dttzu das Pull-Down-Menü „Stanen/Compile Datei“ bzw. das
Tastaturmenü „eXternal".
Obige Fehlermeldung enthält auch einen Hinweis darauf, woran der Compiler den Fehler bemerkt
hat: Er legt zu jedem Unit eine Prüfsumme an. Dann werden im Interfacefile jedes Units die
Prüfsuramen aller benutzten anderen Units vermerkt. Beim Lesen des Interfaceteils von Unit „B“
stellte MttxonPASCAL fest, daß das hier lienutzte Unit „A“ nach dem letzten Übersetzen von Unit .,B“
verändert wurde.
Die Prüfsumme (32 Bit breit) wird übrigens nur überden Interface-Teil eines Units gebildet. Es hät¬
te also keine Folgen gehabt, wenn Sie nur im Implemematittnsteil von Unit „A“ etwas geändert hät¬
ten - denn das ist ja sowieso Privatsache dieses Units. Ferner gehen nur die wesentlichen Teile des
Interfaceteils in die Prüfsumme ein, also keine Kommentare, k'er/eilen und andere Layout-Details.
9.12 Projekte - Modulares Programmieren mit Units
9.12.1 Aufräumen im Unit-Verzeichnis
Units sind, wie Ihnen nicht entgangen sein dürfte, ein .sehr leistungsfähiges Konzept, das Sie sicher
oft benutzen werden. Auf die Dauer wird sich da einiges in Ihrem Unit-Verzeichnis ansammeln:
Standard-Units, selbstgeschriebene Unius, diverse Units für alle möglichen Zwecke, die Sie auf Ihren
MaxonP,ASC/\L-Disketten oder in anderen Quelltextsammlungen gefunden haben usw. - und zwar
jeweils zwei Dateien pro Unit. Somit dürfte Ihr Unit-Verzeichnis im kufe der Zeit ganz schön voll
werden. Irgendwann riskieren Sie dann auch, die Übersicht zu verlieren und einem Unit einen
bereits vorhandenen Namen zu geben, wodurch das andere Unit überschrieben würde.
Was können Sie also gegen das drohende Chaos unternehmen (einmal davon abgesehen, daß Sie
nicht mehr benötigte Units löschen können und sollen)? Seit dem Dahinscheiden von CP/M (die
tüteren unter Ihnen werden sich vielleicht noch daran erinnern - auch ich habe z. B. auf einem unter
CP/M laufenden Applell-Clone PASCAl, gelernt, damals, in der guten alten Zeit... aber lassen wir
das!) bietet jedes real existierende Betriebssystem (die 1541 und andere immer noch produzierte
Fossilien übergehen wir hier einmal - so etwas KENNT man als AMIGA-User gar nicht) eine
Möglichkeit, Verzeichnisse aller Art aufeutäumen: Richtig, Unterverzeichnisse sind gemeint („Suh-
Directories" in Basic German). Nichts liegt also näher, als auch im Unit-Verzeichnis damit klar Schiff
zu machen...
Das Problem: woher soll MaxonPASCAL wissen, wohin es Units schreiben bzw. von wo lesen soll?
(Naive Menschen glauben immer noch, mit einem Computer Probleme lösen zu können. In
9. Units und Modulc
213
Wirklichkeit zieht die Anschaffung eines Computers generell unzählige Probleme mit sich, von
denen man vorher nicht einmal zu träumen gewagt hätte...) Aber Sie haben Glück; in diesem
Allschnitt erfahren Sie nicht nur das Problem, sondern auch die Lösung (U'owl), und zwar genau
jetzt (Oh yeah!'):
Zunächst müssen wir unser Unit ja in ein Utiteiverzeichnis schreiben.Daz.u dient die Contpilcr-
Oirective Jproject“, die man an beliebiger Stelle im Unit-Quelltext unterbringen kann, z. B. so;
{$projeGt MatheTools }
Der Projektname muß fonnal ein Bezeichner sein itnd ist die Bezeichnung des Unten'etz.ichnisses,
in dem das Unit abgelegt werdeti soll. Dabei wird das entsprecbende Verzeichnis automatisch ange¬
legt.
M:tn kann aber natürlich auch „manuell“ in Ihrem Unit-Directoiy solche Subdirectorv's anlegen und
Units dort nachträglich ablegen. In Progratnmen und Modulen darf man „fproject" zw'ar auch ver¬
wenden, tiber es hat dort keinerlei Wirkung. Als Abkürzung kann man auch „$pro“ oder alles, was
mit „fproj“ anfängt, schreiben.
Um ein Unit aus einem Untcnerzeichnis des IJnit-Ver/eichnisses zu benutzen, setze man einläch ein
„PROM <Name>“ vor die Uses-Zeile, z. B. .so;
OSES Intuition, Graphics;
FROM MatheTools OSES LongMath, Matrix;
FROM Windows OSES PASCALCrt;
OSES Printer;
Mit diesen Zeilen werden die Units „Intuition", „Graphics“ und ,,Printer“ aus dem Unit-
Hauptdirectrtry sowie ..LongMath“, „Matrix" itnd „PASCAI.Cif' aus den Unterverzeichnissen
„MatheTools“ bzw. „Windows“ gelesen. Das FROM bezieht sich also immer nur auf das nächste
USES.
Für Modula-ll-Kenner; Die Ma.xonPASC.AL-Zeile
FROM XXX USES yyy;
hat nichts mit tier Modula-.AtiWeisung
FROM XXX IMPORT yyy;
ZU tun! Ersteres importiert ein ganzes Utiit aus einem Subdirectoiy, letzteres einen einzigen
Bezeichner aus einem Modul.
9.12.2 Organisation von Projekten
Units dienen zwei verschiedenen Zwecken; Wie Sie sich Bibliotheken mit öfter benutzten
Prozeduren und Funktionen aniegen können, wissen Sie bereits. .Aller Sie können mit Units auch
modular programmieren, Lind zwar komfortabler als mit MODULEn - wenn auch mit ein paar klei-
MaxonPASCAl.
214
nen Einschränkungen. Formal besteht natürlich keinerlei Unterschied zwischen „Bibliotheks“- und
„Modtil“-Units, erstere werden eben von vielen verschiedenen Programmen benutzt, während letz¬
tere speziell für ein Programmprojekt geschrieben werden. Trotzdem will ich hier einige Tips für die
Realisierung umfangreicher Programmprojekte unter Benutzung von Units geben.
Als erstes sollte man sich einen Namen für das Projekt ausdenken, denn Units, die nur in diesem
einem Programm benutzt werden, haben im Unit-Hauptvcrzeichnis nichts zu suchen. Auch für die
Quelltexte ist entweder eine neue Diskette zu formatieren oder ein eigenes Unterverzeichnis anzu¬
legen.
Der nächste Job ist schon etwas anspruchsvoller: Man muß ein gewisses Konzept entwickeln, nach
dem man sein Projekt in Units unterteilen will. In der Regel fallen einem bei großen Programmen
sofort gewisse Funktion,sgruppen auf, die weitgehend unabhängig voneinander arbeiten.
Ein Dateiprogramm könnte man zunächst in folgende Units aufteilen;
• Festlegen der Eingabemaske
• Eingabe eines Datensatzes
• Lesen und Schreiben einer Datei
• Prozeduren zum Drucken von Listen usw.
Jedes dieser Units könnte man noch weiter verfeinern. Das sollte man aber nicht unbedingt über¬
treiben, z. B. nicht für jede Prozedur ein eigenes Unit. Ein einzelnes Unit sollte zweckmäßigerweise
nicht mehr als etwa 1000 Zeilen Quelltext umfassen.
Beim Entwurf dieses Konzeptes ist zu beachten, daß Units sich nicht gegenseitig benutzen können,
hier also eine strenge Hierarchie besteht. Deshalb wird man des öfteren mehreren der Hauptunits
ein gemeinsames Unterunit zuordnen müssen. Oft ist es sogar zweckmäßig, ein Unit namens
„Global“ (oder so) zu schreiben, das globale Definitionen (Variablen, Datentypen...) des Programms
enthält und von allen anderen Units benutzt wird.
Dann brauchen Sie noch ein Hauptprogramm. Es sollte aus gewis.sen Gründen (nicht
Gewissensgründen) so kurz wie eben möglich sein, im Extremfall beispielsweise bloß ein Unit
„Haupt“ über USES einbinden und daraus eine Prozedur namens „Hauptprogramm“ aufrufen, der
ganze Rest könnte d:mn in jenem Unit passieren.
Ein Programm (in diesem Kapitel heißt das immer: „ein riesiges Programmprojekt“) schreibt man
natürlich nicht einfach so ‘runter. Vielmehr muß es immer wieder getestet, erweitert, getestet,
erweiten, getest... werden. Wenn Sie aber versuchen, ein Unit zu starten, wird es übersetzt, der
Code ins Unit-Verzeichnis geschrieben und die monotone Meldung „Can’t run a unit!“ ausgegeben -
auf gut deutsch: Ein Probelauf eines Units ist nicht möglich. Deshalb braucht man das
Hauptprogramm, und deshalb sollte es auch möglichst kurz sein: Immer, wenn man ein Unit geän¬
dert und compiliert hat, muß man das Hauptprogramm durch den Compiler jagen, so daß man das
gesamte Programm mit dem geänderten Unit ausprohieren kann.
Es wäre ein unzumutbarer Arbeitsaufw'and, wenn man dazu jedesmal erst den Quelltext des gerade
bearbeiteten Units abspeichem und das Hauptprogramm in den Editor laden müßte. Einfacher geht
9. Units und Module
215
es, wenn man das Hauptprogramm extern übersetzen läßt, also mit dem Menü „Starten/Compile
Datei“ oder dem entsprechenden Tastaturmenü. Auf diesem Wege kann man übrigens auch Units
übersetzen, die wegen eines Prüfsummenlehlers neu compiliert w'erden müssen.
Noch komfortabler wird es aber, wenn man die Quelltextdatei des Hauptprogramms als „Main File
bzw. „Hauptdatei“ definiert. So eine Datei wird immer, nachdem aus dem Editor ein Unit compiliert
wurde, extern übersetzt untl gelinkt. Also wird nach jeder Änderung eines Units das
Gesamtprogramm neu erstellt und kann getestet werden.
9.13 Assembler und PASCAL
Es gibt Tage im Leben eines Programmierers, da kann man es einfach nicht vermeiden, ein
Unterprogramm in Assembler zu schreiben; sei es nun aus Geschwindigkeitsgründen oder bei
maschinennahen Problemen (versuchen Sie 'mal, einen Exceptionhancller oder Interruptserx'er in
P.ASCAl, zu schreiben...). Der MaxonPASCAL-Unker bindet nicht nur PASCAL-Module zusammen,
sondern kann auch A.ssemblerroutinen einlinken.
Prinzipiell können Sie jeden .Assembler benutzen, der Alink-kompatible Objektdateien erzeugt (also
fast jeden). Ich empfehle natürlich den MaxonASM.
Assemblerroutinen werden genau wie PASCAL-.Module eingebunden. Sie können auch umgekehrt
vom MaxonASM aus das PASCAI.-Hauptprogramm einlinken, indem Sie das entsprechende
Objectfile und die Laufzeitbibliothek „paslib.o“ hinzulinken.
Ein Unterjrrogramm wird aus dem .MaxomASM exportiert, indem man das Label am Anfang der
Routine als ,acdef‘ deklariert. Auch Variablen kann man auf diese Weise zwischen der Assembler-
Routine und dem PASCJ\L-Programm austau.schen,
Ein Programmfragment als Beispiel;
Program PASCAL„meets_ASBenibler;
Var a, b: integer; EXPORT;
X: Longint; IMPORT;
Procedure Assi; IMPORT;
Begin { Hauptprogramm }
a:= 42;
b:= 17;
Assi;
writelnt a:10,b:10,x:10)
End.
Ein geeignetes MaxonASM-Programm dazu:
xdef a,b,x,Assi
xref .main
jmp _main ; Einsprung ins Hautprogramm
Assi:
move.w a,dO
move.w b,a
MaxonPAS(]Al.
216
; Werte von “a" und "b" vertauschen
; Produkt a*b berechnen
; ... und in x ablegen
; zurück ins PASCAL-Programm
; Langwort-Variable, wird erportiert
Dieses Programm macht nicht viel Tiefsinniges: Zwei INTEGER-Variable werden initialisiert, eine
Assembler-Routine, die die Variablenwerte vertauscht untl das Produkt in einer LONG-Variablen
ablegt, wird aufgerufen, untl am Ende werden alle drei Variablenwerte ausgegeben.
Wie kann man nun eine Parameterübergabe realisieren? Es gibt natürlich - wie in obigem Beispiel -
die Möglichkeit, die Parameter in gemeinsamen Variablen abzulegen. Wenn Sie einer importierten
Routine wie einer PASC.Al.-Prozedur Parameter übergeben, liegen diese direkt oberhalb der
Rückkehradres.se auf dem Stack (also ab „4{a7)“), wobei die einzelnen Parameter in ihrer normalen
Reihenfolge auf den Stack geschoben wurden, ,sü daß also der erste Parameter an einer höheren
Speicheradresse steht als der zweite.
Dei Rückgabewert von Functions ist stets im Register dO zurückzugeben. Ist er vom 64 Bit breiten
Typ „LongReal , so ist er in dO und dl abzulegen. Der Wert des Adressregisters a5 darf in der
Assembler-Routine nicht verändert werden, davon abgesehen stehen Ihnen alle Register zur
Verfügung.
Einfacher geht die Parameterübergabe aber, wenn Sie im PASCAI.-Programm „External“ statt
..Import schreilxtn. Die Wirkung ist eigentlich die,selbe; wenn ater ein Parameter einen
Registernamen wie „dO oder „a3“ tragt, wird der Wert vor dem Unterprogrammaufaif in das ent¬
sprechende Register geladen. Bei VAR-Parametern erhält das Register die Adresse der referierten
Variablen, bei nichtskalaren Value- Parametern (z. B. Arrays) ist das Ergebnis Undefiniert.
Die Paiameterübcigate in Registern hat atif die Laufzeit übrigens keine Auswirkung, denn die
Parameter werden zuerst wie gewohnt auf den Stack gelegt und erst dann in die Register geladen.
W'enn ein formaler Parameter keinen 6800ü-Regi.stei namen trägt, wird er auch nicht in ein Register
geladen, liegt ater wie gewohnt auf dem Stack.
Die Assembler-Unterroutine kann wie ein Mixlul mit der Anweisung „{Jlink 'xxx'}“ in das PASCAI.-
Programm eingcbuntlen werden. Dann haben Sie aber möglicherweise Probleme mit tiem Pfatl, der
sich beim Aufräumen auf der Diskette ändern kann. Deshalb gibt es alternativ zu „link“ noch die
„ulink“-Anweisung.
Beispiel:
{$ulink "Assemblerteil.o" )
Jetzt wird die angegebene Datei aus dem Unit-Verzeichnis gelesen. Auch hier können Sie
L.'nterv'ei7eichnis,se angeben (analog zum „PROM“ bei Units):
{$ulink "ABsemblerzeugs/Test.o" }
move.w dO,b
muls a,dO
move.1 dO,X
rts
x: blk.l 1
9. Units und Modulc
217
„ulink“ hat noch einen weiteren Vorteil ge}>enüber „link“: Bei Angabe zweier Unit-Pfade kann man
mit „ulink“ wie bei Units ein Puffern der Objektdateien in der RAM-Disk erreichen. Dann müssen Sie
aber aufpassen, wenn Sie gleichzeitig in PASCAl. und Assembler programmieren und eine
Assembler-Objektdatei ändern: vergessen Sie nicht, die neue Version der Objektdatei in BEIDEN
Unit-Verzeichnissen abzulegen, damit MtixonPASCAL sie auch sicher findet.
Stehen „$link“ und „$Lilink“ im Interfäceteil eines Units, so werden sie auch in die Interfacedatei
übernommen, so ilaß die Dateien dann beim „USES“-Aufruf des Units automatisch eingeladen wer¬
den.
10. Projekn-erwaltunR • MAKE
219
10. MAKE - die integrierte Projektverwaltung
10.1 Das Prinzip
10.1.1 Wozu eine Projektverwaltung?
Größere Projekte bestehen nornialeweise nicht aus einer einzelnen Quelltextdatei, sondern aus
einer Vielzahl von Modulen, die vom Linker verbuiulen werden - zumindesten.s sollte es so .sein. Das
nimmt leicht Ausmaße an, die nicht mehr ganz leicht zu überschauen sind. Hinzu kommt, daß es
natürlich Unsinn ist, nach jeder Änderung das ganze Projekt zu übersetzen. Auf die Dauer wird es
aber lästig, sich immer wieder neu zu überlegen, w'elches .Modul jeweils übersetzt werden muß, ein¬
mal ganz davon abgesehen, daß man eigenartige Überraschungen erleben kann, w-enn man dabei
etwas vergißt. So entsteht das Bedürfnis, solche Vorgänge zu automatisieren - wozu hat man
schließlich einen Computer...
Die populärste Projektverwaltung, die auf so ziemlich allen ernstzunehmenden Rechnern anzutref¬
fen und bei allen Compilersirrachen tausendfach bewährt ist, heil.^t „make“. Eigentlich ist „make“
selbst eine .Art Pmgramnriers|rrache, und das macht es natürlich nicht leicht, ein komplettes .Make in
eine graphisch orientierte Entwicklungsumgebung w'ie die von MaxonPASCAL zu integrieren.
Deshalb unterstützt MP.A.SCAL nur einen recht begrenzten (aber den enuscheidenden) Teil von
„make". Außerdem beschränkt „Make“ sich auf Projekte, die aus einem Hauptprogramm und eini¬
gen Modulen Irestehen. Durch Units hierarchisch gegliederte Projekte werden also nicht unter¬
stützt, auch wenn man natürlich in seinem Projekt auch Units benutzen und dazulinken kann. Units
werden aber - im Gegensatz zu Modulen - nicht von der Projekwerwaltung automatisch compiliert.
10.1.2 Was ist das überhaupt - ein Projekt?
Fangen wir doch einmal ganz, graswurzelmäßig von vorn an: Woraus besteht ein Projekt (immerhin
w'ar von einer Projekt-Verw'altung die Rede) - unti was ist überhaupt ein Projekt?
Also, zu den oben erwähnten Einschränkungen gehört, daß ein Projekt immer genau ein ausführba¬
res Programm darstellt. W'enn man im Rahmen eines Projekts ein Programm in mehreren Versionen
erstellen will, muß man eben für jedes einzelne Executable eine eigene Projektdatei erstellen.
OK - ein Projekt ist also ein ausführbares Programm. Und wie kommt man zu einem solchen
Programm, sofern es sich nicht gerade um ein Ifonsai-Miniatur-Projekt handelt?
Richtg, das erwähnte ich schon; Man linkt dafür Objektdateien, also .Module, zu.sammen.
Genaugenommen bindet der Linker auch noch fertige Bibliotheksmodule ein, aber das interessiert
uns hier nur höchst periphär, oder genaugenommen nicht die Bohne. Der Freizeit-Existenzialist
stellt sich jedenfalls nun die Frage „Und wo kommen die kleinen Module her?“, der Coder weiß es
schon: Das hat ausnahmsweise nichts mit Schweinskrams zu tun, sondern die Objektdateien wer¬
den von irgendwelchen Compilern erzeugt.
MaxonPASCAl,
220
Zu jedem der M(xlule gibt es genau einen ganz besonderen Quclltext, nämlicli den Text, aus dem
die Ohjektdaiei durch Cojtipilieren entstein. Um so ein Objekt zu machen, braucht die
Projektverwaltung also iin wesetitlichen eine Information darüber, wie der Quelltext dazu heißt, und
außerdem noch ein paar Zusatzinformationen, etwa den Namen des Compilers oder irgendw'elche
der allseits beliebten Compiler-Optionen.
Aller das ist noch lange nicht alles, denn zu einem normalen Projekt gehüren noch einige Texte
tnehr - normalerweise Intiudedateien, die von tien eigentlichen Quelltexten irgendwo und irgend¬
wie benutzt werden. Das fühn uns natürlich zu der Frage, wann und wie eine Objektdatei neu über¬
setzt wird. Nun, bevor wir alle iti Rente gehen, werden wir vielleicht noch das Entwicklungssystem
erleben, das Programme on-line compiliert, während man den Quelltext bearbeitet. Vorerst ist es
jedenftills noch so, daß man munter an seinen Quelltexien 'nimediert und irgendwann entscheidet,
daß das Programm für eine erneute Übersetz.ung reif ist. Dann tritt die bereits mehrfach erwähnte
Projektverwaltung „.Make“ in Aktion und schaut nach, welche Objektdateien ftir das Projekt nötig
sind, und bevor diese zusammengclinkt w'erden, denkt es scharf darüber nach, welche der
Objektdateien neu übersetzt („recompiliert“) werden muß. Da ja der Com]hIer wenigstens zeitweise
mit dem Programmierer Schritt halten soll, ist auch noch halbwegs einsichtig, wann das zu gesche¬
hen hat: Richtig, genau dann, wenn mindestens einer der Texte, aus denen das .Modul entsteht (d.
h. Quelltext und Indude-Files), seit der letzten Übersetzung verändert wurde. Das läßt sich leicht an
Erstellungsdatum und -uhrzeit der entsprechenden Dateien feststellen.
10.1.3 Was hat das ganze mit „Make" zu tun?
Die Projektvenvaltung verwaltet itn wesentlichen zweierlei Datenbestände: Texte und Objekte. Bei
den Te.xten handelt es sich im allgemeinen um irgendwelche Quelltexte oder Indudedateien, und
aus diesen Texten erzeugt der Comitiler unter der Kontrolle der Prujektvenvaltung die
Objektdateien. Im letzten Schritt werden diese übjektdateien dann mit den Libraries zu einer aus¬
führbaren Datei gelinkt.
Für jede der Objektdateien braucht das Make also Angaben darüber, wie es „gemacht" (daher der
Name) werden soll, insbesondere den Namen eines Quelltexts und eines Compilers. Das wmrde
man natürlich auch noch von Hand hinkriegen, und deshalb sagt man der Projektverwaltung atich,
unter welchen Umständen ein Objekt compiliert w'erden soll und wann die alte Version noch einmal
verwendet werden kann.
Wie bereits gesagt, muß ein Objekt neu übersetzt werden, wenn ein Text, der mit diesem Objekt zu
tun hat, verändert wurde. Normalerweise handelt es sit:h bei diesen Texteti um den Quelltext des
Moduls sowie die darin benutzten Indudedateien. Dazu vergleicht Make tIen Datestamp, also die
Zeit der letzten Veräntlerung einer Datei, der Objektdatei mit denen „ihrer“ Texte, Natürlich wird
ein Objekt auch dann compiliert, wenn es bisher noch nicht existierte.
10. Prujcktvcmaltung - MAKli
221
10.2 Die Praxis
10.2.1 Erstellen von Projekten
;\lle .Angaben über die Struktur eines Projekt,s werden sinnvollerweise in einer Datei festgehalten,
dem Makeille. Mit M;rxonPASC4L erstellen Sie diese Datei interaktiv mit dem Pull-Down-Menü
„Make“ und dem Make-Dialoglenster. Das Makefile wird dabei ständig aktualisiert, also nach jeder
Veränderung neu abgespeicheit, Da eine solche Datei nomtalerw'eise nicht sehr lang sein wird, dürf¬
te dabei auch beim Diskettenhetrieb keine Ver/hgerung auftrelen.
Am besten probieren Sie das Make-Utility einfach aus, indem Sie sich ein Mini-l'rojekt aus zwei
Modülchen erstellen. Damit fangen Sie an, indem Sie tlen Menüpunkt „Neues Makefile“ anwählen.
Wenn bisher keine Projektdatei geladen ist, können Sic ebenso gut auch den Menüpunkt
„Projektverwaltung“ benutzen. Nun er,scheint tler Fileretjuester und fragt Sie nach dem
gewünschten Dateinamen, Meist nennt man tlie Datei ganz einfach „makefile“, jedenfalls dann,
wenn man nicht mehr als eine solche Datei in einem Verzeichnis hat. Wenn Sie dagegen an eitlem
vorhandendem Projekt Weiterarbeiten w'ollen, benutzen Sie den Menüpunkt „Makefile laden“.
Nach dem F-rzeugen einer neuen Projekttkitei öffnet sich ein Fenster, das zwei Scrollisten (eine mit
..Objekt-Dateien“, die andere mit „Quelltext-Dateicn“ betitelt) und eine ganze Menge Gadgets ent¬
hält. Klicken Sie hier am besten einfach auf tias Gadget „Fertig" in der rechten unteren Ecke, um
das Fenster wieder zu schlieKen,
g I MaxoiiP^WtMl Make
igj;
ObJ«kt i«n:
B nalO.o
n«i V« Its . 0
A| vj l ffnäHnV
Hinauf
I
Sh«#
r
irtfo
Anall
Anal!,irrft»
Anall o
Ariall.|)
Analip.ihfo
AnaiOp
AnalOp
AnalOp hfu
An«^rä.o
An^ttsp,Bifü
Makcfito
Wuraal
Vatar
j.
Qu« 11 foKt *'P'ait« I «n:
(Rnali.p
I
HinaufUg«n.
»w»nn»n.
48
47712
issoe
12238
El 87
3de
8S|
Boom
V©r2eichrt3t fWerka ;MaxonPa3c#l3/DCMO/Ar^ealCf 11 /
Datei; tAMiy»i8.p ^
achtbar; | ' | var»tect;t U ~
OK liiitiii&iMitiiwatii AfitajEfc-li
->al
In Editor
t.«d«n-»8€hi
" I .
e»'p' Xhen
ap:«pti(b)i
aip<pf Then. wtiteJP ;
InFix:(b‘' opl, apH
writ6P(b''. namoy. InFlx^b’' opS^ap+l)?
IP apepE Tben vritaP •‘>
Baiätn writePIt<b''.vaXue.O) , VcltePC' ') E
Begln
^iritaPunlcMafte (b'', nafte) ;
If (pcl<b'' opl>>“4) Änd Cb'-
InPlxCb''. opli4>
End
PrqiectMahagar
l/DEm/ftnaiy&aioi-n/nrtart.p
7^t13/Br>aiV3i«t 6 rl I /flhaIO.p
I 53 i I
42 U 421 CfMOt
253/ 233 cfwaV
MaxonPASCAl.
222
An einem Projekt, daß melir als einen Quelltext umfaßt, wird man in der Regel länger als einen Tag
lang arbeiten. Deshalb sollten Sie die folgenden Tips beachten, um es dabei auf lange Sicht komfor¬
tabel zu haben:
Zu jedem Projekt gehört ein eigenes Verzeichnis. Sie sollten also auf jeden Fall mit der
Workbench oder Shell ein neues Lnterv-erzeichnis in Ihrem „PASCAL:"-Verzeichnis oder auch
anderswo anlegen.
i«' Wenn Sie MPASCAI. immer von tier Shell starten, sollten Sie vorher stets in das Verzeichnis
wechseln, in dem das .Makefile liegt. Dadurch wird dies auch für MPASCAI. und Edward zum
aktuellen Verzeichnis, und dadurch werden die SESSION-Dateien von dort gelesen bzw. dahin
geschrieben. Insbesondere werden dann auch die Compiler-Einstellungen von MPASCAI. im
passentlen Verz.eichnis abgelegt und beim nächsten Start von .MPASCAI automatisch wieder ein¬
geladen.
r*' MPASCAI kann von der Workbench tlurch Anklicken des Makefile-Icons gestartet werden. Die
Projektdatei wird dabei automatisch als solche erkannt und geladen (und nicht etwa als
Textdatei in den Editor). Dabei wird das Vciv.eichnis, in dem das Makefile liegt, zum aktuellen
Verzeichnis von MPASCAI und Edward, was wiederum erfreuliche Auswirkungen auf die
Behandlung der SESSION-Files hat (siehe oben).
Die bequemste Art, sich ein Projekt für MaxonPASCAI. einzurichten, geht deshalb so:
1. Stellen Sie sicher, daß die Option „Icons erzeugen" eingeschaltet ist und daß ein geeignetes lee¬
res Verzeichnis für Ihr Projekt existiert.
2. Erzeugen Sie in diesem Verzeichnis wie oben beschrieben eine Make-Datei, die Sie zunächst
einmal so leer lassen, wie sie ist.
3. Beenden Sie jetzt MPASCAI,.
4. Wenn Sie Workbench 2.0 (oder später) benutzen, machen Sie jetzt am besten ein „leave Out“
(auslagem) des Makefile-Icons. Dadurch liegt es immer sichtbar auf dem Workbench-Bildschirm
und kann nach dem Einschalten des Rechners sofort geöffnet w'erden.
5. Starten Sie nun MPASCAI, indem Sie das Makefile-lcon (natürlich doppelt) anklicken. .Nun wer¬
den „Edward.SESSION“ und „mp.SESSlON“ automatisch aus dem Verzeichnis des Projekts gele¬
sen (bzw. dorthin geschrieben).
Vielleicht erscheint Ihnen diese Prozedur etwas umständlich, aber auf die Dauer werden Sie es zu
schätzen wissen, nach dem Booten des Rechners mit einem einfachen Doppelklick genau da Weiter¬
arbeiten zu können, wo Sie zuletzt aufgehört haben.
10, Projcktverwaltung • MAKE
223
10.2.2 Hinzufügen von Dateien, umständliche Methode
Zu einem Projekt gehört natürlich mindestens eine Objektdatei, und um eine solche zu erzeugen,
braucht man einen Quelltext, Versuchen wir es zunächst auf die umständliche Methode und schrei¬
ben einen Text, z. B.
iQodule testmodul;
procedura teat; export;
begin
writeln('Dies ist ein Test.')
end;
begin
end;
Diesen Text speichern Sie einmal als „test.p“ ab (mit einer Datei ohne Namen kann Make nichts
anfangen) und wählen ckmn den Menüpunkt „Make/Projektvemaltuog“. Damit öffnen Sie wieder
das Make-Fenster, das Sie schon beim Erzeugen der Projektdatei gesehen haben. Dabei ist Ihnen
vielleicht auch schon aufgefallen, daß das Fenster vertikal zweigeteilt ist, wobei die linke Hälfte mit
„Objekt-Dateien" und die Rechte mit „Quelltext-Dateien“ überschrieben ist.Wenn Sie nun die
Textdatei „test.p“ und die Objektdatei „test.o“ in Ihr Projekt aufnehmen möchten, geschieht dies
eigentlich ganz intuitiv: Klicken Sie zunächst auf das Gadget „Hinzufügen... “ in der rechten Spalte.
Es öffnet sich nun ein Datciauswahlfenster, in dem Sie die soeben erzeugte Datei „test.p“ anwählen.
Sie bestätigen die Auswahl, der Filerequester wird geschlossen und schon steht „test.p“ in der rech¬
ten Liste des Make-Fensters. Eltenso einfach wältlen Sie jetzt das linke Gadget „Hinzufügen... “ an
und wählen im Filerequester den Dateinamen „test.o“. Höchstwahrscheinlich existiert diese Datei
noch überhaupt nicht, so daß Sie sie folglich nicht einfach anklicken können, sondern den Namen
von Hand eintippen müssen.
Natürlich spielt es keine Rolle, ob sie zuerst - wie hier beschrieben - die Quelltextdatei und dann die
Objektdatei oder umgekehrt eintragen. Die beiden Listen sind zunächst vollkommen voneüiander
unabhängig, und wenn Sie möchten, können Sie jetzt auf beiden Seiten beliebig viele Dateien ein¬
tragen, die allesamt auf der Platte vorhanden sein können, aber nicht müssen. Die Dateien müssen
auch keineswegs im selben Verzeichnis wie die Make-Datei liegen, aber das ist allgemein üblich und
wohl auch am praktischsten.
Wenn Sie jeweils mehrere Dateien aufnehmen, wird Ihnen auffallen, daß die Namen der Quelltext-
Dateien alphabetisch sortiert werden, während die Objektdateien in der Reihenfolge erscheinen, in
der Sie hinzugefügt werden. Dies ist auch die Reihenfolge, in der der Linker später die
Objektdateien aneinanderhängt, was z. B. dann von Interesse ist, wenn man einen eigenen Startup-
Code schreiben möchte. Die Reihenfolge der Objektdateien können Sie mit den beiden Pfeilgadgets
links von der Anzeige für die angew'ählte Objektdatei verändern.
Dumm wie Computer nun einmal sind, müssen Sie nun aber aut:h noch klarmachen, daß die
Ohjekidatei „test.o“ entsteht, indem „test.p“ com[)iliert wird. 'Wählen Sie dazu „test.o“ in der linken
Spalte an (so daß der Name invertiert dargestellt wird und in der Anzeige unter der Objekt-Liste
MaxonPASCAL
224
eischeint) und klicken Sie dann auf das Gadget „Compilcr-Anw.". Alternativ können Sie „test.o“
auch mit einem Doppelklick an wählen,
Nun öffnet sich ein neues Fenster, in dem alle Gadgets bis auf ein Cycle-Gadget oben links und die
üblichen „OK“- und „A6fcr«c/j‘‘-Gadgets am unteren Rand deaktivert sind. Das Cycle-Gagdet zeigt
zunächst ,Mcbt übersetzbar“ an. Nach einem Klick erscheint Ua „intern compilieren“, und
alle Gadgets bis auf ein Stringgadget unten links werden gleichzeitig aktiv. Insbesondere kann jetzt
auch die mit „Quelldatei“ überschriebene Liste benutzt werden. Dort wählen Sie jetzt einfach
„test.p“ als Quelltext an und schließen das Fenster wieder mit einem Klick auf„0/f“.
Im Make-Fenster erscheint jetzt direkt unterhalb der Objekt-Liste „pc -c test.p“. Dies ist eine Pseudo-
Anweisung, mit der man in der Shell „test.p“ nach „test.o“ übersetzen würde, wenn MaxonPASCAL
keine integrierte Entwicklungsumgebung hätte.
10.2.3 Übersetzen des Projekts
Sie können das Programm jetzt compilieren, indem Sie entweder im Make-Fenster auf das Gadget
„Make“ klicken oder wie gewohnt im Editor die Taste <F9> bzw. das Menü „Compiler/Überset¬
zen“ anwühlen. Nun tritt Make in Aktion, stellt fest, daß „test.o“ compiliert werden muß, und bindet
anschließend aus diesem Objectfile ein Programm zusammen - oder versucht es zumindest, denn es
gibt ja noch kein Llauptprogramm. Make funktioniert völlig unabhängig davon, welcher Text sich
gerade im Editor befindet.
10.2.4 Hinzufügen von Dateien, einfache Methode
Beim folgenden Miniatur-Modul, welches das noch fehlende Hauptprogramm enthält, machen wir
es uns etwas einfachen
program haupt;
{$incl "test.h"}
begin
test ;
end.
Diesen Text speichern wir einfach als „main.i)“ ab und wählen den Menüpunkt „Text und Objekt
aufinehmen“. Jetzt macht Make vollautomatisch folgendes:
f»' Die Datei „main.p“ wü-d in die Liste der Texte aufgenommen.
'H'’ Das Objekt „main.o“ wird dem Projekt hinzugefügt.
»»■ Die Compileranw'eisung für „main.o“ w'ircl passend gesetzt.
Jetzt fehlt dem Projekt nur noch eins: Die Header-Datei „test.h", in der die Funktionen (na ja, hier
ist es ja nur eine) des .Moduls „test“ deklariert.
Die Datei test.h enthält folgende Zeile:
It). Projektverwaltung ■ MAKE
225
procedure test; Import;
also (len Prototypen der Funktion. So, wenn Sie jetzt den Compiler starten, müßte das Projekt kor¬
rekt übersetzt und gelinkt werden.
Zuvor sollten Sie aber „test.b“ notb als Quelltext dem Projekt binzufügen (im folgenden Abstbnitt
verrate ich Ihnen auch, wozu tkb gut sein soll). F)as können Sie wie gehabt vom Make-Fenster aus
erletligen. Wenn Sie die Datei aber sowieso gerade im Editor haben, können Sie auch den
Menüpunkt „Make/Text aus Editor aufnehmen“ benutzen, und schon wird der aktuelle Text des
Editors in tlie Quelltext-Liste aufgenommen.
10.2.5 Abhängigkeiten
Das so ziemlich wichtigste Feature tler Projektverwaltung haben wir aber bisher nicht benutzt: Die
Mrhiingigkeiten. Offensichtlich benutzt in unserem Beispiel „main.o" die Datei „test.h“ als
Inckuledatei und Ist folglich davon abhängig. Immer, wenn „test.h“ verändert wurde, sollte deshalb
auch „main.o“ sicherheitshalber neu übersetzt werden.
Öffnen Sie also wieder das Make-Fenster, wählen Sie in der linken Liste die Objekttlatei „main.o“ an
und klicken Sie dann auf das Gadgct „Abhängigkeiten“. Dabei werden Sie bemerken, daß dieses
Gadget invertiert bleibt, bis Sie es erneut anklicken. Nun können Sie in der Quelltext-Liste alle die
Dateien anwählen, von denen „main.o“ abhängig sein soll, also insbesondere „test.h".
Korrekterweise können Sie auch „main.p“ anwählen, aber bei interner Übersetzung weiß
M;ixonPASC.\L von selbst, daß jede Objektdatei von ihrer Quelltextdatei anbängt. Jedenfalls worden
Sie dabei merk, daß Sie jetzt in der rechten Spalte beliebig viele Zeilen gleichzeitig aktivieren und
durch erneutes .Miklicken wieder deaktiveren können. Die.ser Modus bleibt erhalten, so lange das
Gadget „Abhängigkeiten“ invertiert ist. Sie können jetzt auch ganz einfach auf eine andere
Objektdatei klicken, um deren iMahängigkeiten zti betrachten und zu manipulieren.
Im Grunde genommen ist dieses manuelle Setzen von Anhängigkeiten aber überhaupt nicht nötig.
Es reicht völlig, wenn Sic im System-Dialogfenster (Menüpunkt „Optionen/Systeni“) das vielver¬
sprechend mit „Make-Datei: Abhängigkeiten automatisch setzen“ beschriftete Symbol
anw'ählen. Wann immer nun eine Objektdatei des Projekts compiliert wird, merkt MPASCAI. sich,
welche Includedateien dabei gelesen wurden - natürlich nur die selbstgeschrietenen aus dem aktu¬
ellen Verzeichnis und nicht etwa die System-lncludes, die über den im Compiler-Requester angege¬
benen Pfad eingebunden werden.
Anschließend werden die Alahängigkeiien der jeweiligen Objektdatei automatisch gesetzt, wobei
nötigenfalls sogar neue Textdateien in das Projekt aufgenommen werden.
Deshalb beschränkt sich das .Atilegen eines Projekts zusammengefaßt auf folgende Schritte:
Eraeugen sie eine neue Projektdatei.
•• laden Sie alle „echten“ Quelltexadateien, also keine Includefiles, einmal in den Editor und
wählen Sie dann den Menüpunkt „Text und Objekt aufnehmen“.
MaxonPASCAL
226
Stanen Sie die Übersetzung, wobei Sie sieherstellen sollten, daß die Objektdateien allesamt
noch nicht existieren. Dann werden selbsttätig alle Quelltexte durchcompiliert, die
Inciudedateien in das Projekt aufgenommen und die Abhängigkeiten korrekt gesetzt.
10.2.6 Weitere Funktionen im Make-Fenster
10.2.6.1 Projektpflege
Es kommt hin und wieder vor, daß eine Quelltext- oder übjektdatei komplett überflüssig wird.
Dann wählen Sie die betreffende Datei einfach auf der richtigen Seite des Make-Fensters an und
klicken auf das Gadgct „Entfernen“ .Nach einer Sicherheitsabfrage wird die Datei vollständig aus
dem Projekt entfernt.
Ebenso kann es passieren, daß Ihnen ein Dateiname plötzlich nicht mehr ganz passend erscheint.
Dies können Sie elegant erledigen, indem Sie den Dateinamen im Make-Fenster anklicken und dann
das Gadget „Umbenennen...“ benutzen (aber bitte das auf der richtigen Seite, denn auch diese
Funktion gibt es gleichermaßen für Objekt- und Quelldaieien). Es erscheint der übliche
Filerequester, dem Sie nun den gewünschten neuen Namen anvertrauen. Beachten Sie aber bitte,
daß tliese Funktion die Datei ausschließlich in der Make-Datei umbenennt. Das eigentliche
Umltenennen der Datei auf der Festplatte bzw. Diskette müssen Sie .schon .selbst erledigen.
10.2.6.2 Übersetzung erzwingen
Eigentlich entscheidet das Make ja .selbständig und prinzipiell auch korrekt, welche Datei w'ann
recompiliert werden soll. Manchmal möchte man dies aber auch erzwingen, z. B. wenn man
Compileroptionen verändert hat und einige txler alle Objektdateien gezielt mit diesen neuen
Optionen übersetzen lassen möchte. Deshalb gibt es im Make-Fenster das Gadget ..Markieren“.
Ähnlich wie „Abhängigkeiten“ ist auch „Markieren“ ein Umschaltbares Gadget. WährentI es akti¬
viert ist, können Sie in der Objektliste beliebig Dateien anwählen und deaktivieren. Beim nächsten
Übersetzungsvorgang werden die so markienen Dateien dann auf jeden Fall compiliert, und zwar
zusätzlich zu den Dateien, die Make ohnehin für übersetzungswürdig befindet.
10.2.6.3 Dateien in den Editor laden
Beim Programmieren hat man es fast immer nur mit den Textdateien zu tun, die zum aktuellen
Projekt gehören. Deshalb bietet MPASCAL eine elegante Möglichkeit, Quelltexte in den Editor zu
laden.
Öffnen Sie dazu das .Make-Fenster und wählen Sie in der rechten laste den gewünschten Quelltext
an. Wenn Sic nun das Gatlget „In Editor laden“ anklicken, wird der Text - wer hätte das gedacht -
in den Edward hinzugeladen. Das GädgeX„Laden+Schließen“ funktioniert genauso, schließt aber
gleichzeitig das .Make-Fenster. Dies können Sie auch mit einem Doppelklick auf den Dateinamen
erreichen.
10.2.6.4 Projektdatei wechseln
Ani uiitei-en Rand des Make-Fensters belintlen sieh zwei bisher unerwähnte Gadgets; „Makefile
laden“ und „Make verlassen“ Naheliegenderweise erscheint bei Anwahl des erstcren die Datei-
Auswahlbox untl ermöglicht Ihnen, eine andere Projekttlatei zu laden. Mit dem anderen Gadget ver¬
lassen Sie den Make-Modus und gelangen wieder in die normale Betriebsart für Ein-Modul-
Programme.
10.2.7 Compileranweisungen für Objektdateien
10.2.7.1 Interne Übersetzung
Zwischen dem Compileranweisungs-Recitiester der Pntjektverwaltung und dem globalen Compiler-
Dialogfenster besteht auch optisch eine gewisse Ähnlichkeit. Betrachen Sie einmal die Gadgets, die
benutzbar werden, wenn für eine Objektdatei der Modus „Intern compilieren“ angewählt woirde.
Sie werden feststellen, claK tlie wichtigsten Compileroptionen für jedes Motlul des Projekts separat
eingestellt werden können.
0 I WMm
Then
m vrifcePCM')
.. ap) ,
maj i tnfixCb'^
>n weite?(')')
D-IClhl Subranw*
Indaxbaraich
QHPafl IfrtackeroP«
piPaH Arithn. «barlauf
OlPafi Sani ho Ion naldan
Oabuawar-Datal
meid Bbb»fialwl«fc. aut.
w&3.ue,0>; ¥rxteP<' '’i E
itt (Ij'' ns»©) i
And <b'',na»©<>
Extarwa
(Tlnin
• P
_T
©Kt+ObJ
All^cnifin gelten die globalen Einstellungen auch im Make-Modus, sofein eine Option nicht explizit
anders eingestellt wird. Deshalb fmtien Sie im Compileranweisungs-Reciuester eine ganze Mengt
kleiner Cycle-Gadgets mit den Stellungen „Def\ „Ein“ und „zl«s“. Dabei steht „Def ‘, wie man sief
denken kann, für „Default“, d. h. bei dieser Schalterstellung soll für das Modul die globale
Einstellung gültig sein.
MaxonPASCAL
228
Bei den mit „Optionen überschriebenen Gadgets entsprechen die ersten sieben exakt den entspre¬
chenden globalen Schaltern. „Auto-Make“ entspricht einem Gadget aus dem „System“-Requester
und legt fest, ob die Abhängigkeiten der betreffenden Objektdatei vom Make automatisch gesetzt
werden sollen.
Natürlich fehlen noch ein paar Compileroptionen, 2 . B. ist es über die Requester nicht möglich, für
eine Übersetzungseinheit die Include-Pfade anders zu setzen. Solche (wohl eher ungewöhnliche)
Einstellungen sind aber möglich, wenn Sie die Projektdatei in den Editor laden, „von Hand“ veiän-
dern, abspeichern und dann erneut als Makedatei laden. In Abschnitt 3.3 erfahren Sie, wie die
Projektdateien aufgebaut sind.
10.3 Handgemachte Makedateien
10.3.1 Die Grundlagen
Das Format der Projektdateien von MaxonPASCAL orientiert sich an den Standard-Makefiles, ist aber
natürlich etwas strikter, da in der integrierten Entw'icklungsumgebung ja nur ein gewisser Ausschnitt
des Irekannten Make implementiert werden konnte. Es ist dadurch relativ leicht, ein solches
Makefile von Hand zu erstellen oder ein vorhandenes Makefile an MaxonPASCAL anzupas.sen. Wenn
Sie nicht in der integrierten MPASCAL-Umgebung arbeiten, sondern die Option „-m“ des mpc benut¬
zen, bleibt Ihnen sogar nichts anderes übrig, als Make-Dateien grundsätzlich manuell zu erstellen.
Es gibt zwei verschiedene Arten von Zeilen, nämlich Abhängigkeits- und Anweisungszzeilen. Sie
unterschieden sich formal dttdurch, daß letztere mit einem Leerzeichen oder Tabulator beginnen.
Ein „Eintrag“ beginnt grundsätzlich mit einer Abhängigkeit.szeile, die dem Make sagt, w'as erzeugt
werden kann und von welchen Dateien es abhängig ist. Optional können eine oder mehrere
Anweisungszeilen folgen, die festlegen, wie das fragliche Objekt erzeugt werden muß.
10.3.2 Der Linkeraufruf
MaxonPASCAL eiwanet als ersten Eintrag stets die Exe-Datei, um die es geht (Sie erinnern sich:
Leider immer nur ein Exefile pro Makefile). Die Exe-Datei ist - formal gesehen - von den
Objektdateien abhängig, und erzeugt wird sie durch einen Linker-Aufruf. Als Linker muß hier der im
mpc benutzt w'erden (auch wenn Sie nicht mpc, sondern MPASCAI. verwenden). In diesem
Zusammenhang sollte ich wohl erwähnen, daß es für das Verständnis dieses Kapitels enorm hilf¬
reich w'äre, wenn Sie schon ein wenig mit dem mpc vertraut wären.
Eine Abhängigkeitszeile beginnt stets mit dem Namen der zu erzeugenden Datei, gefolgt von einem
und optional der Uste der .Abhängigkeiten. Wenn unser Projekt „Demo“ heißt und aus den bei-
tlen Modulen „main.o“ und „test.o“ besteht, beginnt unser Makefile also mit den Zeilen:
Demo: main.o test.o
mpc main.o test.o -o Demo
10. ProjcktvcrwaltunR- MAKE _
Dazu noch einige Anmerkungen:
- Da das MaxonPASCAL Make keinen externen Linker aufruft, sondern alles implizit intern erle¬
digt, ist auch die Option „-o Demo“, die den Namen der Rxe-Daiei festlegt, strenf^enommen
nicht erforderlich, zumal er aus der .Abhängigkeitszeile bereits bekannt ist. Aus Ästhetischen
Gründen sollte man diese .Angabe aber trotzdem machen.
- MaxonPASCAl, Make weiß, das ein Linkeraufruf von den benutzten Objektdateien abhängig ist.
Deshalb sind auch die beiden Einträge in der Abhängigkeitszeile nicht wirklich nötig.
ln der Linkeranweisung sind auch die benutzten Units mit der in Abschnitt 2.5.6i Option „-U“ auf¬
zuführen, da der Linker ja nicht wissen kann, welche Units für das Projekt benötigt werden. Dies
entspricht den Textgadget „Makc-lJnits“ im Compiler-Requester.
Beispiel:
PC main.o test.o -o test -U printer -ü Windows/pascalcrt
10.3.3 Internes Compilieren
Nach dem Linkeraufruf folgen in beliebiger Reihenfolge die Einträge für die einzelnen
Objektdateien. Wenn Ihnen danach ist, können Sie auch Einträge für Projektdateien hinzufügen, die
überhaupt nicht zum Projekt gehören - die werden dann ignoriert.
Auch hier beginnt jeder Eintrag mit einer Abhängigkeit.szeile, also z. B. main.o: main.p test.h
Die Objektdatei „main.o“ soll also bitteschön übersetzt werden, wenn eine der Dateien „main.p
und „test.h“ in letzter Zeit verändert wurde. Eehlt noch der Compileraufruf: Der Compiler heilst ja
bekanntlich genau wie der Linker ..mpc' (oder auch „cp", siehe oben). Die Option ,,-c sorgt dafür,
daß eine Objektdatei statt einer Exe-Datei erzeugt wirtL
main.o: main.p test.h
mpc -c main.p
Außer „-c“ kann auch jede andere Compiler-Option aus Kapitel 2.5.6.6 benutzt werden, z. B. „-gB
zum Einschalten der .Airbruchmöglichkeit. Bei allen Optionen, die nicht explizit gesetzt werden, wer¬
den die globalen Defaults verwendet.
Es ist übrigens nicht zwingend erforderlich, dem Make zu sagen, daß ein Objekt von seiner
Quelltextdatei (und das gesamte Projekt von seinen Objektdateien) abhängig ist, denn das weiß
Make auch so. Also könnte man das Makefile folgendermaßen abkürzen:
Demo: mpc main.o test.o
test.o:
mpc -c test.p
main.o: test.h
mpc -c main.p
MaxonPASCAI.
230
10.3.4 Externe Übersetzung
jede Compileranweisung, die mil „mpc" beginnt, wird von MaxonP.ASCAI. „intern“ ausgefiilin, d. h.
Make und Compiler sind Bestandteile eines einzigen Programms und keines von beiden muK
irgendwie nachgeladen werden. Leider ist MaxonRASüU, ziigegebenermafSen nicht ausreichend (z.
B. hat man öfters ein Assembler-Modul in seinem Projekt). Alxtr auch das ist kein Problem:
Schreiben Sie die Anweisung ganz einfach in das Makelile! Sie können dann sogar mehrere nachei¬
nender auszuführende Zeilen (=Shell-Aiweisungen) für eine Übjektdatei angeben, z. B. so:
sub.o: Bub.asm
mptbin/masm sub.asm -c clos echo "Assembler ist
fertig"
Wenn Sie diese Projektdatei von der integrierten Umgebung MRASCAI. ausführen lassen, wird vor¬
her sogar geprüft, ob die Dateien, von denen das Objekt abhängig ist (in diesem Falle nur
„sub.asm ), sich im Ftlitor befinden und seit ihrer letzten Abspeicherung veränden wurden. Falls ja,
werden sie automati.sch abgespeichert, denn der externe Compiler/Assembler liest seinen Quelltext
ja aus der Datei und nicht (w'ie MaxonP.ASCAL) direkt aus dem Edward.
Speziell bei der Benutzung des Mttxon Assemblers gibt es noch eine Besonderheit: Nach der Über¬
setzung schaut MPASCAI, nach, ob eine zur Objektdatei passende „.err''-Datei erzeugt wurde (im
Beispiel also „sub.err"). Falls ja, versucht MPASCAl. diese als MaxonAsm-Fehlerdatei zu inteqrretie-
ren und die Fehlermeldungen direkt im Compilerfenster anzuzeigen. Also wäre hier der Aufruf
masm sub.asm -c clos -v sub.err höchst empfchlenwert.
Noch einmal zurück zu den Mehrfach-.Aiweisungen: Wie gibt man die eigentlich in MPASCAL ein, da
es doch im Compileranweisungs-Requester für externe Übersetzeraufnife nur ein Textgadget gibt?
Nun, hier sind die Zeilen mit einem Gegenschrägstrich „\“ zu trennen. Davor und dahinter muß aus
Gründen der Eindeutigkeit jew'cils ein Leerzeichen stehen.
10.3.5 Weitere Features
Bisher wurden die Grundfünktionen von Make erläuten, die vom internen Make direkt und sichtbar
unterstützt werden. Es gibt aber noch eine ganze Menge zusätzlicher Features, die besonders dann
von Interesse sind, wenn man seine Projektdatei für den CLI-Compiler meppe von Hand schreibt,
10.3.5.1 Zeilenverbindung
Die Anzahl der Dateien in einem Projekt wächst oft schnell an und mit ihr auch die Längen von
Abhängigkeitszeilen oder Linkeraufrufen. Da z. B. Edward die Zeilenlängen auf 256 Zeichen
beschränkt, stellt sich irgendwann das Problem, daß man mehr in eine Zeile packen möchte als
eigentlich gesund ist.
Die Lösung ist die Zeilenverbindung mit dem Gegenschrägsirich. Endet eine Zeile mit „V‘, so verbin¬
det Make sie mit der nächsten Zeile. Auf diese Weise können beliebig viele „echte“ Zeilen zu einer
einzigen Make-Zeile zusammengefaßt werden.
10. Projektverwaltung- MAKE
231
10.3.5.2 Kommentare
Kommentare beginnen für Make mit einem
# makefile für "Demo"
# Version vom 24.05.94
Demo: main.o # heute nur eine Objektdatei
mpc main.o -o Demo # Linkeranweisung
Da Kommentare dem Make selbst ziemlich egal sind, werden sie auch nicht irgendwie gemerkt.
Aber immerhin merkt sich MaxonPASCAL Make beim Lesen einer Projektdatei, ob darin
Kommentare, Makros oder Regeln (siehe dazu die nächsten Abschnitte) vorkamen. Haben Sie als
Benutzer von MPASCAL in der integrierten Umgebung an der Projekdatei etwas verändert, so daß
das Makefile neu geschrieben werden muß, dann fragt MPASCAl, sicherbeitshalber noch einmal
nach, ob das offensichtlich von Hand erstellte Makefile wirklich überschrieben werden soll. Es
erscheint also eine Dialogbox jnit dem Inhall
Die Projektdatei „<name>“ wurde nicht von
MaxonPASCAL Make automatisch erstellt.
Wollen Sie sie trotzdem überschreiben?
Ja Nein
Sie haben dadurch bei Bedarf noch Zeit, z. B. eine Shell zu öffnen und Ihr mühsam handgeschriebe¬
nes Makefile vor der Vernichtung durch MP,\SCA1. zu retten. Sie können die obige Nachfrage natür¬
lich auch verneinen, aber dann wird das Update der Projektdatei nur aufgeschoben, nicht aufgeho-
Ikm, und bei der nächsten Gelegenheit nervt MPASC.M. erneut mit der selben Frage.
10.3.5.3 Makros
Auch einfache Makros können in Make verw'entlet werden. Dieses Feature geht aber keineswegs so
weit wie z. B. die Makros im PASCM.-Preprozessor, vielmehr kann man im Text lediglich eine
Zeichenfolge (den Makronamen) durch eine andere ersetzen las.sen. .Maer auch das ist hin und wie¬
der ganz nützlich.
Man definiert sich ein Makro durch eine Zeile der Form
<.Makroname > = < Inhalt >
Als Makroname ist dabei eine beliebige Folge von Buchstaben, Ziffern und dem Unterstrich
erlaubt.
Objects = main.o test.o sub.o
llnk_2 = mpc -g40 -gsi -1 amiga
X = Exeflle
MaxonPASCAL
232
Naciidem ein Makro auf diese Weise definiert wurde, kann es benutzt werden, Dazu muß dort, wo
tias Makro durch seinen zugewiesenen Wert ersetzt w'erden soll, ein Doiiarzeichen „1“ vorangestellt
werden. Ist der Makroname mehr als ein Zeichen lang, muß er außerdem auch noch in runden
Kiammein eingeschiossen werden. Nach den obigen Definitionen könnte eine .Make-Datei also so
beginnen:
$X: $(Objects)
$(link_2)
$(Objects)
Daran sehen Sie auch schon die beiden typischen .Anwendungen von Makros im Makefiles: Zum
einen spart man bei geeigneter .Anwendung Tiitparlteit, zum anderen mui,‘! man für bestimmte Ande-
mngen wie das Hinzufügen weiterer Objektdateien nur noch an einer Stelle der Datei die
Makrodefinition verändern, statt an mehreren Stellen den gleichen Mist einzutippen. Nebenbei räu¬
men geschickt gewählte Makros den Quellte.xt auf und sorgen so fiir mehr Übersicht.
Es gibt einige vordefinierte Spezialmakros:
Jl“ ist fest mit dem Dollarzeichen belegt. Wenn Sie an irgend einer Stelle Ihrer Prnjektdatei ein ein¬
zelnes „$ haben sollen, z. B. als Bestandteil eines eigentümlichen Dateinamens wie „a$b". müssen
Sie also ein doppeltes Dollarzeichen schreiben („a$ib‘"), um Make davon abzuhalten, das nachfol¬
gende (hier also „b ) als .Makro zu Ixihandeln. Außerdem gibt es noch „$*“ und die bei
Regeln eine wichtige Rolle spielen:
10.3.5.4 Regeln
Es ist auf die Dauer ziemlich ermüdend, immer wieder von Hand einzutippen, daß Make aus einer
auf „.asm endenden lextdatei eine „.o"-Objektdatei erzeugen soll, indem es einem bestimmten
Assembler mit bestimmten Optionen aufruft. Dieser Vorgang kann durch Make-Regeln erheblich
abgekürzt werden.
Die Definition einer Regel sielit auf den ersten Blick wie ein ganz normaler .Makefile-Eintrag aus, nur
tlaß der Name der (Pseudo-)Zieldatei aus den Endungen von Quell- und Zieldatei zusammengesetzt
ist und keine Abhängigkeiten angegeben werden dürfen. Eine typische Regel für .Assembler-Module
könnte z. B. so aussehen:
■asm.o: masm -c cloB $*.asm -o $@
Das Makro „$*“ wird durch den seiner Endung beraubten Dateinamen, „S(g'" durch den vollständi¬
gen Namen der Objektdatei ersetzt.
MaxonPASCAL Make wendet Regeln nur an, um Objektdateien zu erzeugen, die in tler
Abhängigkeilszeile der Linkeranweisung genannt werden und für die es keinen Eintrag mit einer
expliziten Conipileranweisting gibt. Dann wird nach der ersten Regel gesucht, bei der die Endung
der Zieldatei (meist „.o“) stimmt und eine entsprechende Quelldatei auch existiert.
10, ProiekU'erwaltung ■ MAKE
233
Beispiel:
.p.o: pc -c -pc -O $*.p
Demo: main.o test.o
pc main.o test.o sub.o -o Demo
main.o: main.p test.h
Wenn nun die Dateien „main.p“, „test.p“ und „sub.p“ existieren, wird für „test.o“ die erste, für
„main.o“ die zweite und für „sub.o“ überhaupt keine Regel benutzt - denn wenn „sub.o“ nicht in der
Abhängigkeitszeile der Exe-Datei auftaucht, sieht Make auch keinen Handlungsbedarf zur
Erzeugung derselben.
Für „main.o“ wurde im Beispiel sogar eine Mahängigkeitszeile eingeführt. Gibt es eine solche nicht,
setzt Make automatisch den Namen der Quelldatei als einzige Abhängigkeit.
Es gibt beim MaxonP.\SCAI,-Make zwei eingebaute Regeln:
.p.o: pc -c $*.p übersetzt Pascal-Quelltexte.
Beachten Sie, daß MaxonPASCAL Make bei interner Übersetzung als Compiler-Optionen die global
eingestellten Defaults verwendet. Außerdem gibt es eine „.asm.o“-Anweisung für.\ssembler-Module.
In der integrierten Umgebung MPASCAI. kann die zugehörige AnweLsungszeUe im System-
Dialogfenster eingegeben werden (übrigens die selbe Anweisung, die auch benutzt wird, w'cnn der
Menüpunkt „Text uad Objekt aufnehmen“ auf eine „.asm“-Datei angewendet wird).
11. Standard-Units
235
11. Standard-Units _
Auf Ihren Ma-xonPASCAL-Disketten finden Sie einige fertige Units, die Sie in Ihren Programmen ver¬
wenden kiinnen. Diese Unit-Sammlung wird ständig ei-weitert (insbesondere sind Sie, jawohl, genau
Sic (!), aiifgerufen, von Ihnen geschriebene nützliche Units der Allgemeinheit zur Verfügung zu stel¬
len). Deshalb können wir schlecht alle mitgelieferten Units in diesem Handbuch dokumentieren.
.Also folgt jetzt eine Beschreibung der wichtigsten Standard-Units, zu den übrigen werden Sie
Dokumentationen als ASClI-Datei auf der Source-Diskette finden.
11.1 Crt und PASCALCrt
Das Unit Crt öffnet in seinem Initialisierungsteil auf der Workbench ein Window geeigneter Größe
sowie ein Console-Device dazu und verbiegt mit „SetSldlO“ die Standard-Ein-/Ausgabe auf dieses
Fenster. Also erspart dieses Unit Ihnen viel Routinearbeit, wenn Sie für die Ein- und Ausgaben eines
Programms ein eigenes Fenster öffnen wollen.
Außerdem stellt Crt einige Prozeduren und Funktionen zur Verfügung, die Sie vielleicht schon
vermißt haben; Mit „ReadKey“ und „KeyPressed" ist es endlich möglich, einen Tastendruck abzufra-
gen (Iteim AMIGA ist dies nicht ohne weiteres über die Standard-EA, die ja ein „CON:“-Window ist
oder wenigstens so tut als ob, möglich). Durch die Funktion „WindowClosed“ können Sie das
Betätigen des Fenstei-schließsymbols abfragen. Auch andere Ereignisse können Sie bequem abfra-
gen, und da Sie Rastport und Userport des Fensters kennen, können Sie im Ausgabefenster sogar
(zusammen mit den Units „Intuition“ und „Graphics“) Grafik ausgeben oder Gadgets und Menüs
venvenden.
Auch wenn Sie alle diese Features nicht brauchen, können Sie das Unit „Crt“ benutzen, um Ihre
Programme von der Workbench stanbar zu machen: „Uses Crt“ bewirkt, daß beim Programmstart
automatisch ein Window geöffnet und die Standard-EA darauf umgeleitet wird - sonst laufen die
Programme genau wie zuvor.
TOhrend „Crt“ in Assembler programmiert wurde, um den Code möglichst kompakt zu halten, ist
„PASC.ALCrt“ (im Untercorzeichnis „Windows“) eine sonst vollkommen identische Implementation
des Units „Crt“ in P/\SC.M.. Dieses Imit liegt Ihnen auch als Quelltext vor, so daß Sie es bei Bedarf
mixlifizieren können.
Es ist aber nicht sinnvoll, in einem Programm sowohl „Crt“ als auch „P/\SCALCrt“ zu benutzen, denn
dann werden ja gleich zwei identische Ausgabefenster geöffnet.
Folgende Prozeduren und Funktionen werden jeweils in den teiden Units definiert;
Functioü KeyPressed: Boolean
Die Funktion KeyPressed wird „true", wenn eijre Taste gedrückt wird bzw. sich bereits im
Tastaturpuffer befindet oder am l.iserPort des Ausgabefensters eine Nachricht eintrifft bzw, schon
anliegt.
MaxonPASCAL
236
Beispiel:
Repeat
Write('Hallo! ')
Untll KeyPressed;
Das Programmfragment gibt so lange ununterbrochen „Hallo“ aus, bis eine Taste gedrückt oder das
Fensterrschließsymbol angeklickt wird.
Procedure WaitForKey
Die Prozedur wartet, bis eine Taste gedrückt wird oder ein Ereignis eintritt. Falls sich bereits eine
faste im Puffer befindet oder eine Nachricht am Window-UserPort anliegt, wird natürlich nicht
gewanet.
sVaitForKey verbraucht beim Warten keine Rechenzeit, ist also solch’ fragwürdigen Konstrukten
(„busy wait“) wie
Repeat üntil KeyPreesed
in jedem Fall vorzuziehen.
Function ReadKey: Char
Diese Funktion liest ein Zeichen von der Tastatur. Dabei wird zuvor durch Aufruf von „WaitForKey“
auf eine Taste oder ein Ereignis (Message) gewartet. Falls keine Taste gedrückt, statt dessen aber
eine Message empfangen wurde, gibt ReadKey den Wen chr(O) zurück.
Beispiel:
Uses Crt;
Var O! Char;
Segln
Repeat
c:= ReadKey;
WriteLnt'ABcii-Code', ord(c):4)
üntil o = ehr(13)
End.
Das Programm holt Zeichen von der Tastatur und gibt deren ASCIl-Code aus, bis der Code der
Return-laste gelesen wird. ReadKey bewirkt kein Echo, d. h. ein gelesenes Zeichen wird nicht auto¬
matisch auf den Bildschirm au.sgegeben.
Function MessageReceived (Maske): Boolean
Maske: Longint
Wenn „KeyPressed“ wahr wird, bnn das zwei Ursachen haben: Entweder wurde eine Taste gedrückt
oder am UserPon des Ausgabefensters wurde eine Nachricht empfangen. Diese Messages enthalten
11. Standard-Units
237
Infurmationen über verschiedene Ereignisse, z
, B. Betätigung des Fensterschließgadgets, Anwahl
eines Piill-Down-Menüs usw,
FaUs eine derartige Nachricht anliegt, liefert „/W%“ den Wert Chr(O), und man kann mit
„MessageReceiveci“ bestimmen, um welche Art von Nachricht es sich handelte.
Im Interfiiceteil des Units „Crt“ werden die folgenden Konstanten definien:
NEWSlZE
REFRESHWINDOW
MOUSEBUTTONS
MOUSEMOVE
GADGETDOWN
GADGETUP
REQSET
MENUPICK
_CLOSEWINDOW
RAWKEY
REQVERIFY
REQCLEAR
MENUVERIFY
NEWPREFS
DISKINSERTED
DISKREMOVED
WBENCHMESSAGE
ACTIVEWINDOW
NACTIVEWINDOW
DELTAMOVE
VANILLAKEY
INTUITICKS
$00000002; { Änderung der Fenstergröße}
$00000004; { Fensterinhalt neu aufzubauen }
$00000008; { Drücken/Loslassen einer Maustaste }
$00000010; { Mausbewegung }
$00000020; {Gadget angeklickt}
$00000040; { Gadget losgelassen }
$00000080;
$00000100; { Menü angewählt}
$00000200; {Close-Gadget)
$00000400; {Tastendruck, Key-Code}
$00000800;
$00001000;
$00002000;
$00004000; {Ändern der Preterences)
$00008000; { Einlegen einer Diekette}
$00010000; { Herausnehmen einer Diskette}
$ 00020000 ;
$00040000; { Fenster aktiviert} I
$00080000; { Fenster deaktiviert}
$00100000; {Verschiebung bei Gadgets }
$00200000; {Tastendruck, ASClI-Code}
$00400000;
Diese Zahlen heißen „IDCMP-Flags“ („IDCMP" = „Intuition Direct Communicaüon Me.ssage Port“).
Man kann mit
If MessageReceived (NEWSIZE) Tlien ...
abfragen, ob die Fenstergröße verändert wurde. Da aber jedes Signal einem Bit entspricht, kann
man auch abfragen, ob eins von mehreren Signalen empfangen w-urde, indem man die Codes mit
OR verknüpft:
Repeat
Until MeasageReceivedtDISKREMOVED Or _CLOSEWINDOW);
Diese Schleife wird ausgeführt, bis eine Diskette aus dem Laufwerk entnommen oder das Fenster
geschlossen wurde.
MaxonPASCAL
238
Vorher muß man aber dem Betriebssystem mitteilen, von welchen Ereignissen man überhaupt
erfahren möchte, und zwar mit den Prozeduren „SellDCMP" und „MdlüCMP“. Als Default ist beim
Offnen des Fensters nur das „JlLOSmiNDOW-Vh^ gesetzt. „MemgeReceived' holt die Nachricht
aber nicht ab - Sie müssen mit der „/?e*-“-Funktion das Chr(0)-Zeichen lesen, damit das Unit
„Crt weiß, daß Sie die Message ausgeweriei haben.
Eine Auswertung der Fenster- und/oder Tastaturereignisse konnte also so aussehem
Uses Crt;
Var c: Char;
Begln
AddlDCMP (MODSEBUTTONS); { zusätzlich Mauskllcka abfragen }
Repeat
c:= ReadKey;
If c = chr(O) Then
Begln
{ Nachricht auswerten: }
If MessageReceived(MOaSEBUTTONS) Then
WritelnC Klick!’);
If MessageReceived(_CLOSEWINDOW) Then
Writelnt' Bye bye!');
{ usw. }
End
Else
Begin
{ Taste auswerten, z. B. so: }
Write(c);
End;
{ Programmende mit Close-Gadget oder Esc-Taste: }
Until {MesaageReceived(_CLOSEWINDOW) ) Or (c=#x);
End.
Natürlich sind beide leile o[itiünal, d. h. wenn Sie nur Tasten oder nur Messages auswerten wollen,
können Sie tiie jeweils anderen Ereignisse ignorieren. Wichtig ist nur, daß Sie auch zur Message-
Behandlung die Funktion „ReadKty“ benutzen müssen, denn sonst kann das Unt „Crt“ ja nicht wis¬
sen, wann Sie eine Nachricht au.sgewertet haben und die nächste haben wollen.
Procedure SetlDCMP (Maske)
Maske: Longlnt
Diese Prozedur definiert die IDCMP-Flags des Aiisgaliewindows (siehe unter JlessageKeceived").
Als Default ist am .Anfang nur „_aOW/;VDOW'‘ gesetzt.
Procedure AddlDCMP (Maske)
Maske: fxmglnt
11. Standard-Units
239
Im Gegensatz zu „SeUDCMP", das die IDCMP-Flags definiert, ftigt die Prozedur „AddlDCMP“ nur
neue Flags hinzu. Der Parameter wird also mit den bisherigen Flags OR-verknüpft. Somit ist
,AddlDCMP(0)'‘ eine leere (nichts bewirkende) Anw'eisung, während „SetlDCMP(O)“ alle Flags
löschen würde.
Procedure SublDCMP (Maske)
Maske: Longint
Dies ist das Gegenstück zu „AiMIDCMP“-. Die als Parameter übei^ebenen Flags werden aus der
IDCMP-Maske des Fensters gelöscht.
Function WindowClosed: Boolean
Diese Funktion ist eine Ahkürz.ung für „.Me.ssageReceived(_CLOSRV('lNDO'K')“.
Man kann damit bequem abfragen, ob das Close-Gadget des Fensters angeklickt wmrde. Es gilt aber
dasselbe wie bei „MessageReceived“: Die Ereignisse müssen mit der „ReadKey"-?unküon abgeholl
werden, damit das „Crt‘‘-Unil weiß, daß sie bearbeitet wurden.
Beispiel:
Uses Crt;
Var c: Char;
Begin
Repeat
c:= ReadKey
üntll WindowClosed
End.
Ohne den „ReadKey“-Aufruf wäre dies eine Endlosschleife, denn die entsprechende Message würde
nie am Userport des Windows abgeholt; außerdem wäre es ein „Busy Wait", der Rechenzeit ver¬
schwendet.
Function CrtMessage: Ptr
Falls ein Aufruf von „MesscigeRecewed“ ergibt, daß eine Nachricht empfangen wurde, liefert diese
Funktion einen Zeiger auf dieselbe (sonst „NIL"). Man kann sie dann näher auswenen.
Uses Crt, Intuition;
Var c: Char;
m; ‘IntuiMessage; { im Unit "ntuition" definiert )
Begin
AddlDCMPtMOUSEBUTTONS);
Repeat
c:= ReadKey;
If MessageReoeived(MOUSEBUTTONS) Then
MaxonPASCAl.
240
Begln
m;= CrtMesaage;
Writelnl'Position:', m*.MouseX:5, m*.MouseY:5);
End
Untll WlndowClosed
End,
'Xenn Sie mit der linken Maustaste in das Ausgabefenster klicken, gibt dieses Programm die genau¬
en Koordinaten der Position an.
Function CrtMndow: Ptr
Diese Funktion liefert die Windowhandle des Crt-Windows. Sie brauchen Sie für viele Zwecke, z. B.
wenn Sie das Fenster mit einem Gadget oder Menü versehen wollen.
Function CrtRastPort: Ptr
Mit dieser Funktion erhalten Sie einen Zeiger auf den RastPort des Crt-Fensters. Diesen Pointer
benötigt man vor allem für Grafikbefehle.
Beispiel:
Uses Crt, Graphics;
Var Elng6ibe: Char;
1: Integer;
xl, x2, yl, y2: Real;
Begln
Wrlte(#e'0 p');
{ Cursor unsichtbar machen }
SetAPentCrtRastPort, 1);
{ Zeichenfarbe: weiß }
Por 1:=1 to 200 Do
Begln
xl:= 320+300*sln(l/25);
x2:= 320-300*sln(l/20);
yl:= 120+100»cos(l/32);
y2:» 120+100*cos(1/40);
Move(CrtRastPort, Round(xl), Round(yl));
Draw(CrtRastPort, Round(x2), Round(y2))
End;
Repeat Eingabe:» ReadKey Untll WlndowClosed
End.
Die,ses Programm gibt mit Hilfe dreier Funktionen der Graphics-Library (die in Unit „Graphics“ defi¬
niert wird) ein recht hübsches .Muster aus.
Im entsprechenden Abschnitt der AMIGA-Einführung in diesem Buch finden Sie Näheres über die
Grafikfunktionen.
11. Standard-Units
241
Function CrtUserPort: Ptr
Gibt einen Zeiger auf den l'serPort des Cn-Fensters.
Function NameOfPrograin: Str
Diese Funktion gibt tien Namen des Cn-Fensters aus. Im allgemeinen wird hier der Name genom¬
men, unter dem das Programm als FAC-File von der Workbeneh oder vom CU geladen wurde. Falls
es aber aus der MaxonPASCAL-Entwicklungsumgebung gestartet wurde, gibt es zwei Sonderfälle:
wurde Ma.xonPASCAL aus dem CLI gestaltet, erhält das Console-Fenster die entspreehende CLl-
Anweisung, beim Workbenchstart wird „MaxonPASCiAL“ als Default benutzt.
Function CrtConsole: Ptr
Von dieser Funktion erhalten Sie die Handle des Console-Devices, das vom Unit „Crt" für das Ein-
/Ausgabefenster geöffnet wird. Wenn Sie in Ihrem Programm ein zweites Window öffnen und mit
JetSicllO“ die Standard-E/\ vorübergehend darauf umleiten, können Sie sie nachher wieder mit
„SetStdlO(CrtConsole)“ auf das normale Cit-Fenster zurücksetzen.
Function TextLines; integer
Diese Funktion gibt an, wieviele Textzeilen im Ausgabefenster Platz haben.
Function TextColms: integer
Gegenstück zu „TextLines“: Gibt die Anazhl der Textspalten des Windows zurück.
USES crt;
BEGIN
Writelnt'Das Fenster ist '»TextColms,»TextLines,' Zeichen
groß.');
WaitForKey
End.
Function WhereX: integer
Mit dieser Funktion können Sie die aktuelle Cursorposition erfragen. Sie gibt die Spalte zurück, in
der der Cursor steht.
Function WhereY: integer
Liefert analog zu „WhereX" die Spalte, in der der Cursor gerade steht.
MaxonPASCAL
242
Procedure 'MiidowUtles (windowname, screenname: Str)
Das Unit „Crt“ gibt dem Window den Namen, unter dem das Programm gestartet wurde. Mit der
Prozedur „WindowTitles“ kann dieser Name sowie der Name der Workbench geändert werden. Der
Titel der Workbendi ändert sich aber nur solange, wie das Cit-Fenster aktiv ist.
Wenn Sie einen Parameter auf „Nil“ setzen, entspricht dies keinem Namen. Der Wert „Str(-1)“
bewirkt, daß der bisherige Name erhalten bleibt.
Beispiele:
WindowTitles ('Test', Str(-l))
Window heißt „Test“, Name des Workbenchscreens bleibt erhalten
WindowTitles (Dateiname, 'Editor');
Der Fenstername entspricht dem Inhalt der Variablen „Dateiname“ (z. B, eine Stringc-ariable),
während der Worklienchscreen bei aktivem Cn-Fenster den Namen „Editor“ erhält. Achtung: Wenn
Sie den Inhalt der Stringvariablen ändern, wird der Fenstername NICHT automatisch aktualisiert
(woher soll das Betriebssy'stem das auch wissen), sondern erst beim nächsten Refresh der Titelzeile.
Sie sollten also bei jeder Zuweisung an die Variable erneut die „Wmdou’Titles“-?roiedur aufrufcn.
WindowTitles {Str(-l), Nil);
Der Fenstername bleibt erhalten, die Workbench wird namenlos,
11.2 Printer
Dieses Unit ist in PASCAL geschrieben und ausgesprochen kurz: Im Interfaceteil wird lediglich eine
Text-Dateivariable namens „Lst“ definiert und im Init-Teil unter dem Namen „PRT:“ zum Schreiben
geöffnet. Falls dies nicht gelinge, bricht das Programm mit einer entsprechenden Fehlemieldung ab.
Durch Einbinden dieses Units können Sie also einfach mit
Write {Lst, ...)
Daten auf den Drucker ausgeben.
11.3 Die AMIGA-System-Units
Zum professionellen Programmieren sind auf dem AMIGA die System- Includedateien unverzächt-
bar. Sie enthalten zahllose Deklarationen von Konstanten, Datentypen und Library-Funktionen und
ermögiiehen so den vollen Zugriff auf das AMIGA-Betriebssystem.
Das Problem bei diesen Includefiles ist, dal:! es ganz schön viele werden können und das Übersetzen
somit spürbar Zeit kostet. Um dies etwas zu be.schleunigen, wurden zu den wichtigsten Includefiles
Units erstellt. Ihr Interfaceteil besteht im wesentlichen aus den Includefiles, während ihr
11. Standard-Units
243
Implementationsteü meist leer ist (Irei einigen werden im Init-Teil kleine Initialisierungen vorge-
nommen).
Wegen des enormen Umfangs dieser Indudefiles kann an dieser Stelle nicht jeder dort definierte
Be/eichner erwähnt (und schon gar nicht erläutert) werden. Einiges wird in diesem Handbuch
noch im Kapitel über Systemprogrammierung erklärt, sonst kann ich Ihnen nur empfehlen, sich die
entsprechenden Indudefiles einmal arottisehen und auf die diverse Literatur zur AiMIGA-
Systemprognammierungverw'eisen.
11.3.1 Execl und Exec
E.xec ist der innerste Teil des A.M1GA-Betriebssystems. Deshalb werden einige der Exex-Indudes
auch von anderen Betriebssystemteilen benutzt, während man andere nur braucht, w'cnn man wirk¬
lich direkt Exex programmieren will.
Aus diesem Grund wurden zwei Exec-Units definiert: Zunächst „Execl“, das in seinem Interfaceteil
folgende Indudefiles enthält;
exec/lists.h
exec/nodes.h
exec/porta.h
exec/semaphores.h
exec/taaks.h
Das Unit Excel wird dann auch von so ziemlich allen anderen Systemunits benutzt,
ln ..Exec“ wird dann der gtmze Rest definiert, namentlich der Inhalt folgender Include-Dateien:
exec/alerta.h
exec/devices.h
exec/exeebaae.h
exec/errora.h
exec/inte rrupt s.h
exec/io.h
exec/librariea.h
exec/memory.h
exec/reaident.h
AuKerdem wird hier mit „USES“ das Unit „Execl“ eingebunden, so daK dann auch die Definitionen
dieses Units automatisch zur Verfügung stehen.
11.3.2 GraphTypes und Graphics
Die „Graphics“-lndudes sind im wesentlichen in zwei Dateien enthalten: „GraphTypes“ und
„Graphics“. Erstere enthält die wichtigsten Datentypen im Grafik-Bereich, nämlich den Inhalt lol-
gender Dateien:
graphics/gfx.unit.h
graphlcs/clip.h
MaxonPASCAL
244
graphics/copper.h
graphlcs/view.h
graphica/layers.h
graphics/rastport.h
graphic s/text.h
Die Datei „gfe.unit.h“ ist identisch mit „gßc.h“, enthält aber von der dort deklarierten Funktion
„RasSize“ nur den Kopf (wie es im Interfaceteil von Units sein muß). Der Rumpf dieser Funktion
steht im Implementationsteil des Units. Außerdem benutzt dieses Unit das oben beschriebene Unit
„Execl".
Das Unit „Graphics" tenutzt „Execl“ und „Graphtypes“. Im Interfaceteil steht nur noch die
Includedatei „graphics.unit.lib“, die sich von „graphics.lib“ darin unterscheidet, daß die Prozedur
„OjrcnGfe" fehlt. Statt dessen wird die Graphics-Library im Initialisierungsteil des Units geöffnet.
Wenn Sie das Unit „Graphics“ benutzen, mü.ssen Sie diese Bibliothek also weder selbst öffnen noch
schließen.
Beachten Sie aber, daß diese beiden Units nicht alle Grafik-Includes repräsentieren. Wenn Sie also z.
B. mit Gels arbeiten w'ollen, müssen Sie die Datei „graphics/gels.h“ zusätzlich als Includedatei aufru-
fen.
11.3.3 Intuition
Im Interfaceteil des Units „Intuition“ stehen folgende Includedateiem
intuition/intuition.h
intuition/screens.h
Intuition.lib
Außerdem werden die Units „Execl" und „Graphtypes“ benutzt. Der Inhalt der Dateien
„intuition/intuitionbase.h“ und „intuition/preferences.h“ ist also nicht Bestandteil des Intuition-
Units. Im Initialisierungsteil des Units wird die Intuition-Library geöffnet.
11.3.4 Custom
Das Unit „Custom" entspricht der Includedatei „hardware/custom.h“ und definiert somit die
Struktur der Custom-Chip-RegLster. Außerdem exportiert das Unit eine Variable:
VAR CC: Custom ABSOLUTE $DPF000;
Somit ist es möglich, über diese Variable die Chipregister direkt anzusprechen.
Ein extrem einfallsreiches (aber wenigstens kurzes) Beispiel:
Usea Custom;
Var i: integer;
Begln
For l:sO to MaxInt Do
oc.colortO]!= i
11. Standard-Units
245
End.
Dieses kleine Programm änden für einige Zeit ständig die Hintergrundfarbe.
11.4 ExecSupport und ExeclO
Zwischen der direkten Programmierung der I lardware und dem Zugriff darauf über Libraries gibt es
im AMIGA eine weitere Ebene, Geräte wie z. B. den Drucker oder die Diskettenlaufwerke zu pro¬
grammieren; Die Devices.
Dabei liandelt es sich hauptsächlich um Tasks, die ständig laufen (aber natürlich im Waiting State
sind, wenn sie gerade nichts zu tun haben, und somit keine Rechenzeit verbrauchen). Andere Tasks
können den Devices durch Messages Aufträge erteilen, die dann - falls möglich - vom jeweiligen
Device ausgeführt werden.
Ein Device wird von MaxonPASCAL direkt unterstützt: Das Console-Device, das sich um
Texteingaben und -au.sgaben in Windows kümmert. Aul.'lerdem enthält das AMIGA-Betriebssystem
standardmäßig folgende Devices:
Audio Device: erledigt Soundausgaben. .Man kann zwar auch über direkten Zugriff auf die
Hardware-Register Töne erzeugen, aber über dieses Device geht das „sauberer“ und zum Teil
auch einfacher.
ffär Timer Device: bnn praktisch nur eine frei wählbare Zeit lang w'arten und dann melden, daß
die Zeit abgelaufen ist. Man kann es brauchen, wenn man in bestimmten Zeitabständen irgend¬
welche Aktionen ausführen will.
Trackdisk Device: Damit können Sie direkt auf die Blöcke und Sektoren von Disketten zugrei¬
fen. Wenn Sie eine Festplatte besitzen, verRigt Ihr Betriebssystem außerdem über ein Device,
das analog zu „Trackdisk“ auf die Harddisk zugreift.
Input Device: handhabt auf unterster Ebene Benutzereingaben aller Art.
ES- Kevtoard Device: Tastaturtreiber - Gameport Device: befaßt sich mit den beiden „Gameports“,
also den Maus- und Joystickschnittstellen.
“ä“ Narrator Detice: ist für die (meist grausam klingende und deshalb nur selten benutzte)
Sprachausgabe des AMIGA verantwortlich.
Serial Device: Treiber für die serielle Schnittstelle. Jeder, der schon einmal die entsprechende
Schnittstelle unter MS-DOS programmieren mußte, wird von der Leistungsfähigkeit dieses
Devices erfreut sein.
>'*■ Parallel Device: Treiber für die parallele Schnittstelle.
Printer Device: befaßt sich mit dem Drucker und kann z. B. auch Grafiken ausdrucken.
i®" Clipboard Device: unterstützt das Zwischenspeichern und spätere Wiederverwenden von
Daten.
Warum ich Ihnen das alles erzähle? Nun, im AiVlfGA-Betriebssystem „fehlen“ einige Routinen, die
(hauptsächlich) die Programmierung von Devices komfortabler machen, nämlich die Exec-Support-
Funktionen. Sie sind im .AMIGA ROM Kernel Reference Manual: Exec“ als Quelltext enthalten - aber,
MaxonPASCAI.
246
wie nicht anders zu erwarten, in „C“. Diese Funktionen - außer „CreateTask" ■ stehen Ihnen als
M;tx(inPASCAL-User aber in Form eines Units zur Verfiisun}’: Es heißt „ExecSupport“.
Außerdem gibt es noch ein Unit namens „ExecIO“, das alles w'eitere enthält, was man so zum
Device-Programmieren braucht.
Aber zunächst zu „ExecSupport". Hier sind im einz.elnen folgende Prozeduren und Funktionen
implementiert;
PROCEDURE NewList (list: p_List);
Initialisiert die Listenstruktur, auf die tier Parameter zeigt.
FUNCTION CreatePort (name: Str; pri: Byte): p_MsgPort;
Erzeugt einen Message-Port unter dem angegebenen Namen unti mit der Priorität „pri", und gibt
einen Zeigerdarauf zurück. ,\ls kleine Besonderheit merkt das Unit ExecSupport sich, w'elclie Ports
diese Funktion erzeugt hat, und entfernt tliese am Programmende automatisch (mittels eines ent¬
sprechenden ExitSer\'er,s), sofern dies noch nicht ge.schchen ist.
PROCEDURE DeletePort (port: p_MsgPoit);
Ein mit „CreatePort“ erzeugter Messageport wirtl entfernt. Wie bereits olren angedcutet, muß diese
Prozedur in Ihrem Programm [traktisch nie direkt benutzt werden, da am Programmende automa¬
tisch alle erzeugten Messageports gelöscht werden.
FUNCTION CreateStdlO (ioReplyPoit: p_MsgPort): Ptr;
Diese Funktion erzeugt eine Standard-IO-Ketiuest-Struktur und gibt einem Zeiger tlarauf zurück. Als
Paratneter wirtl ein Zeiger auf einen Mes.sageport benötigt, der z. B. zuvor mit „CreatePort“ erzeugt
wtxden sein kann. Wenn die Struktur nicht eingerichtet werden konnte, steigt die Funktiotr mit
einer Fehlermeldung aus. Wie bei „CreatePort" wertlen auch hier alle eingerichteten lO-Strukturen
am Programmende automatisch freigegeben, sofern dies noch nicht geschehen ist.
PROCEDURE DeleteStdIO (ioStdReq: Ptr);
Als Gegenstück zu „CreateStdlO" löscht diese Prozedur eine „normale“ 10-Request-Struktur.
Allerdings werden diese Strukturen am Programmende auch automatisch gelöscht, so daß Sie
„DeleteStdIO" nur selten direkt benutzen werden.
FUNCTION CreateExtIO (ioReplyPort: p_MsgPort; size: Long): Ptr;
Einige Devices benötigen eine um gewisse gerätespezifische Einträge erweiterte IO-Ret]uest-
Struktur. .Mit der Funktion „CreateFlxtlO“ kann man solche Strukturen beliebiger Größe (Parameter
11. Standard-Units
247
„size“ entspricht der Gesamtgröße im Bties) analog zu „CreatcStdIO" erzeugen lassen. Die zusätzli¬
chen Felder werden mit Nullen initialisiert.
.\uch diese Funktion steigt bei Mißerfolg mit einer Fehlermeldung aus und merkt sich intern die
eingerichteten Strukturen, so daß diese am Programmende automatisch gelöscht werden.
PROCEDURE DeleteExtlO (ioExt: Ptr);
Diese Prozedur löscht eine mit „Create&ctIO“ erzeugte Stniktur.
PROCEDURE BeginlO (ioReq: Ptr);
Der Aufruf dieser Prozedur entspricht einem Einsprung in eine interne Funktion, die jedes Device
besitzt und allgemein eine lO-Operation startet. „BeginlO“ ähnelt stark der Exec-Funktion „SendlO“,
allerdings ist „BeginlO“ direkter, d. h. ohne zusätzlichen Exec-''Überbau‘'. Im allgemeinen sollte man
„SendlO“ benutzen, während „BeginlO“ nur in einigen speziellen Fällen sinnvoll benutzt werden
kann.
Das Unit „ExecSupport“ benutzt übrigens das Unit „Execl“.
Wie bereits erwähnt, gibt es noch ein Unit namens „ExedO“. Es benutzt die Units „Facecl“ sowie
„ExecSupport“ und enthält im Interfaceteil folgende zur Deviceprogrammierung notwendigen
Includefiles:
'exec/libraries.h■
■exec Zdevices.h'
'exec/io.h'
Außerdem exportiert es noch zwei Prozeduren:
PROCEDURE Open_Device (DevNametStr; Unit:Long; lOReq; Ptr;
Flags: Long)
Diese Prozedur entspricht der Exec-Funktion „OpenDevice“, bis auf zwei Unterschiede:
1. Konnte das Device nicht geöffnet werden, steigt „Open_Device“ mit einer Fehlermeldung aus.
Deshalb konnte es auch als Prozedur implementiert werden, während „OpenDevice“ eine
Function ist, die eval. eine Fehlernummer zurückgibi.
2. Wieder einmal wird über die geöffneten Devices Buch geführt, so dalä sie am Programmende
vollauttrmatisch geschlossen werden und das System immer schön aufgeräumt ist.
PROCEDURE Close Device (ioRequest: Ptr)
Unterscheidet sich von der Exec-Prozedur „CloseDevice“ nur insofern, als daß hier anhand der von
„Open_Dcv'ice“ erzeugten Liste geprüft wird, ob das Device auch wirklich geöffnet wurde und daß
diese Prozedur verzichtbar Lst, da am Programmende alle Devices automatisch geschlossen werden.
Anhang
249
A) Compiler-Fehlermeldungen _
expected.
expected.
expected.
")" expected. *
expected.
expected.
"=" expected.
"[" expected.
"]" expected.
" expected.
"OF" expected.
"BEGIN" expected.
"END" expected.
Der Compiler vermutet, dal.'! an der angcgeheiien Stelle da.s entsprechende Symbol .stehen mül^te.
Dabei ist aber zu beachten, daß er den Fehler nur grob analysiert und im Grunde gentimmen abso¬
lut keine Ahnung hat, was Sie an dieser Stelle eigentlich vorhatten. Deshalb kann der eigentliche
Fehler auch an einer ganz anderen Stelle liegen.
Absolute variables must get declared single.
Werden Variablen als „A]3SÜI.LrrE“ deklariert, müssen sie einzeln deklariert werden. Falsch wäre
■L. B.
VAR a,b: integer ABSOLUTE Adr;
richtig dagegen
■VAR a: integer ABSOLUTE Adr;
b: integer ABSOLUTE Adr;
Boolean Expression expected.
Der Compiler erwartet hier einen Boole'schen Ausdruck, for e.xample als Bedingung bei lF..Then,
W1iile..Dü oder Repeat..Until.
Branch too far.
Sprünge, die inhärent bei P.ASCAl.-Strukturen wie IF, REPFAT oder GASE auftreten, dürfen im Code
nur über eine Strecke von maximal 32767 Bytes reichen, ln der Praxis dürfte dieser Fehler kaum auf¬
treten, denn das bedeutet, daß sit:h z. B. eine Schleifenstruktur über tausende von Programmzeilen
MaxonPASCAL
250
erstreckt. Falls Sie so etwas tatsäcltlich einmal zustande bringen, sollten Sie den Umfang der
Struktur durch Zerlegen in Prozeduren verringern ■ denn Unterprogrammaufrufe (und auch GOTO-
Spriinge) sind von dieser Regelung ausgenommen.
Can not jump into a structure.
Man kann mit GOTO nicht von außen z. B. in eine FOR-Schleife hineinspringen.
Can not open mathieeedoubbas.Iibrary!
Vor dem ersten Com[)iler-Lauf wirtl die genannte Bibliothek geöffnet. Sie muß sich also im „Libs:“-
Verzeichnis befinden.
Can not write unit.
Die Interface-Datei eines Units konnte nicht geschrieben werden.
Can’t copy tbis file.
Bei einem Indude-Dateien mit zwei angegebenen Pfaden konnte die Datei zwar über den zweiten
Pfad gelesen, nicht aber an den ersten Pfad kopiert werden.
Can’t create directories.
Beim Kopieren von Includefiles und Units werden bei Bedarf Unterverzeichnisse automatisch
erstellt. Das ging hier schief
CASE needs an ordinal expression.
•Mit CASE können nur geordnete Datentypen verglichen werden, also beispielsweise keine Real¬
oder String-Werte.
Compiler stack overflow.
Der Task-Stack war nicht groß genug Rir den Compiler (dürfte kaum Vorkommen).
Constant expected.
Tritt an verschiedenen Stellen auf, u. a. Im CONST-Definitionsteil und in der CASE-.Anweisung. Hier
darf nur eine Konstante stehen.
DO expected.
Hinter WHILE, WITH oder FOR fehlt das zugehörige DO. Vielleicht haben Sie sieb aber auch in der
Bedingung vertan, so daß der Compiler deren Ende an dieser Stelle vorzeitig vermutet.
Double definition
Ein Label wurde zweimal gesetzt.
Double use of Identifier.
Sie haben in einem Deklarationsteil (z.B. Variablentleklaration) einen Bezeichner definiert, der auf
selber Ebene schon einmal deklariert ist.
Anhang
251
Element type is too large,
Sets dürfen mxximal 65536 Elemente enthalten, wobei die Grenzen auf Vielfache von 16 auf- hzw.
abgerundet werden.
Error in String
Beim Einschließen von Stcuercodes in Stringkerastanten haben Sie irgendetwas falsch gemacht.
Error while reading unit.
Dateifehler beim Lesen des Interface-Teils eines Units
Field identifier expected.
Dies ist kein gültiger Feldbezeichner dieses Recordtyps.
FUe expected.
Hier hat eine Variable eines Dateityps zu stehen.
File is not of required Type
Die mit ..{$link ...}“ oder als Unit eingelatlenc Datei ist keine Objektdatei.
FILE OF FILE is not allowed.
Der Elementtyp eines File-Typs darf weder selbst ein File-Typ sein noch einen solchen enthalten.
File not found
Eine Indude-Datei konnte nicht gefunden werden, vielleicht, weil sie gar nicht existiert.
Filename expected.
Hinter der Compiler-Directives „ind“ und „path" müssen jeweils Dateinamen stehen, die mit einfa¬
chen ' oder doppelten „ Hochkomma einzuschliessen sind.
Filename too long.
Die maximale linge von Dateinamen für Indude-Dateien beträgt einschließlich Pfad 80 /.eichen.
Files must be VAR parameters.
Wenn sie eine Datei als Parameter an eine Prozedur otler Funktion übergeben w’ollen, muß dies in
Form eines VAR-Parameters geschehen.
First constant is higher than second one.
Bei der DeFinition eines Ausschnittstyps (z.. B. eines Array-lndextyps) haben Sie den Bereich so
gewählt, daß die obere Grenze kleiner als die untere ist.
FOR needs an ordinal type.
Die Schleifenvariable einer FOR-Schleife muß von einem geordneten Datentyp sein (insbesondere
nicht REAl.).
MaxonPASCAL
252
Functions can return simple, pointer or string types only.
Der Datentyp, den eine Function zurückgibt, kann sein:
• Ganzzahl, Boolean, Char oder ein Ausschnitt eines solchen Typs
• Real
• Pointertyp
• String
Garbage at end of program.
Hinter dem Programmende steht noch etwas.
Global procedure without parameters expected.
Prozeduren, die als Parameter bei .AddExitServer“ angegeben werden, müssen global sein und dür¬
fen keine Parameterliste halten.
Identifier expected.
Der Compiler meint, daß hier ein Bezeichner stehen müßte.
Identifier not defined in that translation unit
Ein Bezeichner wurde fälsch qualifiziert, z. B. „System.Hallo“, so daß er im entsprechenden Unit
nicht gefunden werden konnte.
Illegal type for textfile input
Daten dieses Typs können nicht mit Read/Readln aus einer Textdatei (zum Beispiel von der
Tastatur) gelesen werden.
Illegal assignment or Compiler failure Type conflict or Compiler failure
Double panic - general protectioni
Hier haben Sie den Compiler ertappt. Es ist intern etwas eingetreten, was eigentlich nicht sein darf.
Zu Deutsch: Es handelt sich um einen Bug des Compilers oder um einen fälschlich nicht gemelde¬
ten Fehler Ihres Programms. Wahrscheinlich liegt cs daran, daß er sich in der Vielzahl der kombi¬
nierbaren umerscbiedlichen Datentypen verheddert hat.
Illegal type for textfile output.
Daten dieses Typs können nicht mit Write/VChiteln in eine Textdatei (z, B. auf den Bildschirm)
geschrieben werden.
IMPLEMENTATION expected.
im Interfaceteil eines Units trat ein Fehler auf.
Incompatible parameterlists.
Die Parameterhste (oder auch, bei Funktionen, der Ergebnistyp) eines Prozedur/Funktion-
Parameters paßt nicht.
Anhang
253
Integer expression expected.
An dieser Stelle muß ein ganzzahliger Ausdruck stehen, z. B. als Längenangabe von String[..j oder
Feldbreiten;mgahe bei Write(-Ln).
Label expected.
Hinter dem „LABEL“-Symbol kann entweder ein gewöhnlicher Ikzeichner oder eine Ziffernfolge
(ganze Zahl) stehen.
oder: Was hier hinter GOTO steht, ist nicht als Label deklariert worden.
Label on wrong level.
Ein label darf nur auf der Ebene ge.setzi werden, auf der es deklariert wurde, insbesondere nicht in
einem Unterprogramm dieser Ebene.
Lib-base must be of Longint or Pointer type.
Die Basisadresse einer Library muß ein Ausdruck eines der genannten Typen sein (vielleicht liegt es
daran, daß Sie „IntBase“, „DosBase“ oder „SysBase“ deklariert und dann ein System-Include-Datei
geladen haben).
Magic number does not match.
Ein Unit woirde zwar gefunden, aber der Compiler stellte fest, ilaß es gar kein Unit ist.
Memory overflow
\Währencl des Cnmpilierens ist der Arbeitsspeicher übergelaiifen. Verlassen Sie MttxonPascal und ver¬
suchen Sie es mit größerem Arbeitsspeicher noch einmal.
Name too long (max. 80 chars)
Dateinamen von Units u. ä. dürfen einschließlich Pfad höchstens 80 Zeichen lang w'erden.
Nesting overflow
Die Schachtelungstiefe wn Prozeduren untl Funktionen darf höchstens 16 betragen.
No free memory for buffer.
Aus Geschwindigkeitsgründen wird für Include-Dateien jeweils ein Pufferspeicher angelegt. Dieser
Error sagt, daß dafür kein S[ieicher mehr reseiviei t werden konnte.
No free memory for BSS-Huok.
Für die als STATIC oder EXPORT tieklarierten Variablen ist kein Speicher mehr frei.
No free memory for relocation table.
Der Cominler muß gelegentlich für die Relokationstabelle (was das ist, braucht Sie nicht unbedingt
zu interessieren, falls Sie es nicht wissen) zusätzlichen Speicher reserc'ieren. Wenn Sie diese
Meldung erhalten, haben Sie ihr RAM so vollgeknallt, daß nicht mehr einmal ein paar KByte für die¬
se Tabelle frei waren.
MaxonPASCAL
254
No free memory for unit.
Es war kein Speicher zum Einlinken einer Datei frei.
Numeric expression expected.
Hier muß eiti numerischer Aii.sdriick stehen.
Only global Procedures/Functions can get exported.
Lokale Prozeduren und Funktionen dürfen nicht mit ..EXPORT' ausgeführt werden.
Ordinal Type expected.
Ordinal expression expected.
Hier dürfen nur geordnete Datentypen stehen, also Boolean, Char, Ganzzahl- und
Aufzählungstypcn.
Offsets must be integer.
Die Adressoffsets in einer Library müssen natürlich gaimuhlig sein.
Out of ränge
Zur Compile-Zeit wurde bereits fcstgestellt, daß irgeiulwo ein Bereichsüberlauf .staitfmdet, z. B. bei
„chr(257)“.
Overflow at nesting of Incl-files
Indude-Dateien dürfen mttximal 25-fach ineinander verschachtelt werden. Auch die Interface-Teile
von Units werden beim Lesen intern als Indude-Dateien behandelt (w'as sie aber nicht sind), so daß
dieser Fehler auch hier auftreten kann.
Overflow in floating-point-aritbmetic.
Bereits zur Compile-Zeit trat bei Fließkummarechnungen ein Überlauf auf, z. B. durch eine zu große
Konstante.
Please set an unit directory.
Wenn Sie Units mit „USES“ einbinden oder ein Unit compilieren (wobei es automatisch abgespei¬
chert wird), müssen Sie im Pull-Down-Menü „Suchpfade“ mindestens ein Directory dafür angeben.
Am besten setzen Sie mit dem PascalPrefs-Programm einen entsprechenden Eintrag in die Config-
Datei.
Please use „Round“ or „Trunc“.
Gleitpunktausdrücke können nicht über nttrmale Typkonvenienmgen wie z. B. „Long(x)“ oder
IntegerfSqrt (a))“ in ganze Zahlen gewandelt werden. Dazu sind die genannten Funktiojien zu ver¬
wenden.
’PROCEDURE’ or FUNCTION’ expected.
Die.ser Fehler tritt nur innerhalb einer Ubraty-Deklaration auf
Anhang
255
“Program“ expected.
Am Anfang mul^ nicht unbedingt „Program" stehen. Dieser Fehler wird immer gemeldet, wenn das
Programm nicht sinnvoll anfängt.
Short Circuit of Units.
Ein Units ruft sich selbst auf, evtl, auch indirekt über weitere Units,
Simple type expected.
(wird u, a. bei EXCHANGE gemeldet): hier sintl nur Variablen einfacher Datentypen erlaubt:
Geordnet, Real oder Pointer.
String exceeds line.
Eine Zeichenkette darf das Zeilenende nicht überschreiten. Vielleicht haben Sie bei einem String das
Hochkomma am Ende vergessen oder eins gesetzt, w'o Sie gar keines setzen wollten.
String expression expected.
Falscher Parameter bei „Insert", „Delete“ o, ä.
String too long.
Die maximale Länge von Stringkonstanien beträgt 400 Bytes.
Syntax error in Compiler directive.
ln einer Compiler-Directive haben Sie irgend etwas falsch gemacht.
Temporary Strings can not get assigned to „STR“-pointers.
Die String-Verknüpfung „-f“ .sowie die Funktionen „Concat“, „Copy" und „RealStr“ liefern einen
temporären String zurück, der keinen dauerhaften (also nur „temporären“) Speicherplatz besitzt.
Deshalb ktinn man diese Fimktionsergehnisse zwar an STRING-Variablen zuweisen, nicht aber an
STR-Variablen.
Dieser Fehler wird auch gemeldet, wenn ein temporärer String als Parameter des Typs „Str“ überge¬
ben wird,
THEN expected.
Hinter einem IF fehlt das zugehörige THEN. Vielleicht haben Sie sich aber auch in der Bedingung
vertan, so daK der Compiler deren Ende an dieser Stelle vorzeitig vermutet.
These types can not be converted.
Eine derartige Typkonvertierung ist nicht möglich.
This function identifier ctm not be a Statement.
Am Anfang eines Befehls - oder dessen, was der ComitUer dafür hält - steht unerlaubterweise ein
Funktionsnamc.
MaxonPASCAI.
256
This Procedure/Function can not be used as parameter.
Nicht jetle Standaidfunktion kann als Parameter übergeben werden. Beispiele: ehr, sin, cos oder
srqt dürfen, ord, eof oder sqr dagegen nicht. Faustregel; Fdne Funktion, bei der Parameterliste und
Rückgabetyp immer gleich sind, darf übergeben werden {„sqrt“ bildet immer von Real auf Real ab,
..Sqr“ aber von jedem numerischen Typ auf denselben, besitzt also mehrere Signaturen). Für
Prozeduren gilt natürlich sinngemäK das selbe.
TO expected.
Hinter einem FOR fehlt das zugehörige TO oder DOWTO. Vielleicht haben Sie sich aber auch im
Ausdruck vertan, so daß der Compiler deren Ende an dieser Stelle vorzeitig vermutet.
Type expected.
Hier muß ein Typ stehen, egal, ob als Typbezeichner oder als Beschreibung.
Type conflict.
Zwei Datentypen passen nicht zueinander, z.B. die heiden Konstanten, die die Grenzen eines
Ausschnittstyps festlegen.
Type conflict of operands.
Die Typen zweier Operanden pas.sen nicht zusammen.
T^'pe-free pointers must not be used here.
Bei NEW und DISPOSE dürfen Sie keine Variablen des Typs „Ptr“ als Parameter angeben, da der
Compiler ja nicht weiß, wie viel Speicher er dafür reservieren muß.
Type identifier expected.
Hier darf nur ein Typbezeichner stehen. Typbeschreibtmgen sind nicht zulässig.
Unable to open main file.
Nach dem (ibersetzen eines Units konnte die angegebene Hauptdatei nicht gefunden werden.
Undefined Type.
Dieser Datentyp wurde zwar schon erwähnt, aber noch nicht ilefinieri.
Beispiel: „Type a= b; c=b;“ ergibt diesen Fehler.
Unexpected end of source.
Der Qtielltext war „überraschend“ (für den Compiler) zu Ende.
Mögliche Ursache; Sie haben einen Kommentar begonnen und die Klammer am Ende vergessen.
Unit not found.
Das angegebene Unit w'urdc nicht gefunden.
Unknown identifier or Syntax error.
Diese Fehlermeldung kann so gut wie alles bedeuten und kann auch an so ziemlich jeder
Programmstelle auftreten. Entweder wairde ein Bezeichner nicht deklariert oder ein grober Fehler
in der Syntax gefunden.
USES expected.
Hinter „FRÜM <Projektname>'' muß „USES" stehen.
Variable at odd address
Einer als .tüiSOLUTE deklariene Variable, die mehr als ein Bete belegt, w'urde eine ungerade Adresse
zugewiesen. Hier spielt der Prozessor nicht mit.
Variable expected.
Hier soll eine Variable stehen.
WITH expects a variable of a record type.
Hinter VC'TFH muß eine Record-Variable stehen (mit 99%-iger Wahrscheinlichkeit haben Sie an Stelle
einer Record-Variablen einen Pointer auf eine solche gesetzt).
Wrong Index type.
Sie haben wahrscheinlich beim .\iTay-Zugriff einen Index mit einem falschen Datentyp verw'endet.
B) Laufzeitfehler
Subscript out of ränge.
Der Index eines Arrays (wozu natürlich auch die Strings gehören) war außerhalb des angegebenen
Bereiebs.
Diese Fehlermeldung erhalten Sie nur, wenn im Menü „Optionen/Compiler“ der Punkt
„Indexberekh“ abgehakt ist.
Out of ränge.
Einem Ausschnittstyp wurde ein Wert außerhalb des deklarierten Bereichs zugewiesen.
Eine solche Bereichsüberprüfung wird nur vorgenommen, wenn die Compiler-Option „Subrange
testen“ während des Compilierens angewählt ist.
Division by zero.
Es wurde mit „/‘, „div“ oder „mod" durch 0 dividiert.
Error: Can’t open xxx.library
a) Beim Befehl OpenLib wurde die angegebene Bibliothek nicht gefunden.
b) Die „matbtrans.library'“, die für verschiedene Real-Funktionen benötigt ward, befindet sieb nicht
im Verzeichnis „libs:“.
MaxonPASCAL
258
Out of memory.
Das freie RAM ist knapp, so daß „New“ oder„yl//oc_?nm“ nicht ausgeführt werden konnte.
Freemem failed.
a) Mit DISPOSE wurde versucht, ein dynamisches Objekt zu löschen, das nicht existiert bzw.
bereits gelöscht wurde.
b) Es wurde versucht, mit Free_Mem Speicher freizugeben, der nicht mit dem Befehl Alloc_mem
reserviert wurde (wenn Speicher mit der Exec-Funktion ,AllocMem“ angefordert wxirde, kann er
nur mit „FreeMem“, NICHT mit dem Befehl „Free_Mem" freigegeben werden).
User Break.
Sie haben das Programm mit der Taste <F10> abgebrochen.
Error in Gase.
In einem CASE-Statement ohne ELSE-Zweig trat eine nicht vorgesehene Alternative auf (also ein
Wert, der nicht als Konstante angegeben ist).
Error in Closelib
Die angegebene Library existiert nicht, wurde bereits geschlossen oder war nicht mit OpenLib (son¬
dern z. B. mit der Exec-Funktion „OpenUbrary“) geöffnet worden.
Overflow error.
Es trat in einer arithmetischen Operation (z. B. Integer-Addition) ein Überlauf auf.
Um eine solche Fehlermeldung zu erhalten, müssen Sie vor dem Compilieren die Compiler-Option
„Aritbm. t/ftert“ aktivieren.
Intuition error
Ein Window oder Screen konnte nicht geöffiiet oder geschlossen werden.
Exec error
Bei einer Exec-Funktion lief etwas schief
D) Die Kommandos des Editors
ln diesem Teil des Anhangs erhalten Sie eine diematische Übersicht über alle verfügbaren
Kommandos des Editors. Der Hinweis „Referenz" /.u Beginn eines Abschnitts gibt Ihnen das jeweili¬
ge Kapitel an, in welchem Sie weitere Informationen zu dem vorgestellten Kommando erhalten kön¬
nen.
Alle Editorkommandüs werden in einem einheitlichen Format dargestellt. Bei der Angabe der
Parameter gilt es folgendes zu beachten :
Die Parameter werden von p", p' bis p" durchnumeriert. Hinter jedem Parameter wird sein Typ ange¬
geben.
Beispiel:
p''=STRlNG
bedeutet, dai,^ der erste Parameter ein String sein soll.
Fa; gibt folgende Parametertypen :
1) VALUE:
Eine ganze Zahl.
2) STRING:
Eine durch Anführungszeichen „ begrenzte Zeichenfolge.
3) LIST:
Eine durch „(" und „)“ begrenzte .Aufzahlung von Elementen. Die Elemente dürfen dabei
VALIJES, STRINGS und natürlich auch USTcn sein. Im allgemeinen erw'arten die Kommandos
Edw'ards jedoch ihre Parameter in einer genau spezifizierten Reihenfolge. Informationen darü¬
ber sind dann aber in der Beschreibung des Befehls zu finden. Listen dienen ebenfalls der
Rückgabe von Werten, insbesondere im Zusammenhang mit der ARexx-Schnittstelle.
Ein „OPT_“ vor einem Parameter bedeutet, daß er optional ist und auch weggelissen werden darf.
Als Rückgabewert ist außer VALUE, STRING und LIST zusätzlich noch der sogenannte
SMA11_STRING möglich. Hierbei handelt es sich um eine Zeichenfolge, die nicht durch
Anführungsstriche begrenzt wird. Dies ist allerings nur im Zusammenhang mit der ARexx-
Schnittstelle sinnvoll, da die Kommandos Edwards ihre String-Parameter immer als STRING erwar¬
ten.
MaxonPASCAL
260
D-1 Eingabe und Bearbeitung von Texten
Kommando : BackSpace
Abkürzung Back
Parameter
Funktion
Löscht das Zeichen links vom Cursor. Steht der Cursor am Anfang einer Zeile, so wird diese mit
der vorigen Zeile zusammengefüg.
Kommando : Delete
Abkürzung Del
Parameter
Funktion
Löscht das Zeichen, auf dem sich der Cursor befindet. Steht der Cursor am Ende einer Zeile, so
wird diese mit der folgenden Zeile zusammengefügt.
Kommando : KiüLine
Abkürzung Kill
Parameter
Funktion
Entfernt die aktuelle Zeile aus dem Text. Sie wird im Undo-Buffer gespeichert.
Kommando : UndoLine
Abkürzung Undo
Parameter
Funktion
Befindet sich der Cursor in der zuletzt geänderten Zeile, so wird diese in ihren alten Zustand
vor der Änderung versetzt.
Befindet sich der Cursor in einer anderen Zeile, so wird die zuletzt geänderte Zeile in ihrem
Zustand vor der Änderung vor der aktuellen Zeile eingefiigt. Dieses Verhalten dient vor allen
dazu, eine durch „KillLine" gelöschte Zeile wieder richtig in den Text einzufügen.
Anhang
261
Kommando : IndentRetum
Abkürzung IRet
Parameter
Funktion
Die aktuelle Zeile wird an der Cursorposition in zwei Zeilen aufgespalten. Der Teil der aktuellen
Zeile, rechts vom Cursor, wird zur neuen aktuellen Zeile und mit Leerzeichen bzw. Tabs genau
wie die davorliegende Zeile (die alte aktuelle) eingerückt.
w
Kommando
.Abkürzung
Parameter
Funktion
Return
Ret
Die aktuelle Zeile wird an der Cursorposition in zwei Zeilen aulgespalten. Der Teil der aktuellen
Zeile, rechts vom Cursor, wird zur neuen aktuellen Zeile.
Kommando : BigStepUp
Abkürzung BSUp
Parameter
Funktion
Bewegt den Cursor um etwas weniger als die ^Anzahl der angezeigten Zeilen nach oben.
w
Kommando : BigStepDown
Abkürzung BSDown
Parameter :
Funktion :
Bewegt den Cursor um etwas weniger als die Anzahl der angezeigten Zeilen nach unten.
Kommando : MoveUp
Abkürzung Up
Parameter p'’=VALUE
MoFunktion :
Bewegt den Cursor um p" Zeilen nach oben.
MaxonPASCAL
262
Kommando MoveDown
Abküraung Down
Parameter p"=VALUE
Funktion
Bewegt den Cursor um p“ Zeilen nach unten.
Kommando : ScreenUp
Abkürzung Slip
Parameter p“=VALUE
Funktion :
Verschiebt den Textausschnitt unter dem Cursor um p“ Zeilen nach unten.
Kommando : ScreenDown
Abkürzung SDown
Parameter p''=VALlIE
Funktion
Verschiebt den Textausschnitt unter dem Cursor um p" Zeilen nach oben.
Kommando : MoveLeft
Abkürzung Left
Parameter p“=VALUE
Funktion :
Bewegt den Cursor um p" Zeichen nach links. Geht der Cursor über den Anfang einer Zeile hin¬
aus, so wird er an das Ende der davorliegenden Zeile gesetzt.
Kommando : MoveRight
Abkürzung Right
Parameter p“=VALUE
Funktion
Bewegt den Cursor um p“ Zeichen nach rechts. Geht der Cursor über das Ende einer Zeile hin¬
aus, so wird er an den Anfang der folgenden Zeile gesetzt.
Anhang
263
Kommando ; GoStringPos
Abkürzung GoSPos
Parameter p“=VALUE
Return
Funktion
Positioniert den Cursor auf das Zeichen an Position p" der Zeichenkette der aktueUen Zeile. Die
Position wird von 0 an gezählt.
Kommando : GoDispPos
■Abkürzung GoPos
Parameter : p“=VALUE
Return :
Funktion
Positioniert den Cursor in der aktuellen &ile auf Position p". p'^ wird in diesem Fall von 1 an
gezählt und korrespondiert mit der Anzeige in der Titelleiste des Fensters.
Kommando : Top
Abkürzung T
Parameter
Funktion :
Setzt den Cursor auf den Anfang der ersten Zeile des Textes.
Kommando : Bot
Abkürzung B
Parameter :
Funktion :
Setzt den Cursor auf den Anfang der letzten Zeile des Textes.
MaxonPASCAl. _
D-2 Verwalten von Texten
Kommando
NewText
Abkürzung
Funktion
-
Erzeugt einen neuen Text
Kommando
FreeText
Abkürzung
FTx
Parameter
Funktion
-
Gibt eien aktuellen Text frei.
Kommando : PredText
Abküntung PTx
Parameter
Funktion
Waililt den Text vor dem aktuellen Text an oder, falls dieser der erste Text in der Liste war, den
letzten.
Kommando : SuccText
Airkürzung STx
Parameter :
Funktion
Vi'ahlt den Text nach dem aktuellen Text an oder, falls dieserder letzte Text in der Liste war, den
ersten.
Kommando :
SelTextN
Abkürzung
STN
Parameter
p''=VALUE
Funktion
W^ählt Text Nummer p" aus der Liste vorhandener Texte aus.
Kommando : New
Abkür/ung New
Parameter
Funktion ;
Löscht alle Zeilen des aktuellen Textes.
Kommando : Print
Abkürzung : Pr
^ Parameter p"= STRING
Funktion
Der aktuelle Text wird in die durch p" angegebene Datei ausgegeben. Durch Angabe von
pü=“ptr‘' wird auf den durch die Preferences eingestellten Drucker gedruckt.
MaxonPASCAL
266
D-3 Dateioperationen
Kümmando
Abkürzung
Parameter
Funktion
Save
SA
p"=OPT_STRING
Speichern des aktuellen Textes.
Wurde p“ angegeben, so wird der Text unter diesem Namen abgespeichert und als neuer Name
des Textes übernommen, Wurde für p" ein Leer-String angebenen, so wird der Name des Textes
über einen Dateiauswahlfenster vom Benutzer abgefragt.
Wird p" nicht mitangegeben, so wird der Text unter seinem bisherigen Namen abgespeichert.
Kommando
Abkürzung
Parameter
Funktion
Open
Op
p“=OPT_STRING
Überladen des aktuellen Textes, Der aktuelle Text wird „vergessen“, und der durch p“ angegebe¬
ne Text wird geladen. Wird p" nicht oder nur ein Leer-String für p“ angegeben, so wird der Name
des Textes über einen Dateiauswahlfenster vom Benutzer abgefragt.
Kommando : InsertFUe
Abkürzung InF
Parameter p“=OPT_STRING
Funktion
Einfügen eines Textes in den aktuellen Text, Zu p“ gilt das bereits oben zu „Save“ und „Open“
Gesagte.
Kommando : UpdateText
Abkürzung UtX
Parameter p'’=Value
Funktion
Speichert den Text mit der ID p“, falls er geändert aber ncK'h nicht gespeichert wurde.
Anhang
267
Kommando UpdateTexts
Abkiir/ung UtXs
Parameter :
Funktion :
Speichert jeden Texte, der geändert aber noch nicht abgespeichert wurde.
D-4 Blockoperationen
Kommando : Mark
Abkür7.ung Mk
Parameter :
Funktion :
Aktiviert den Markierung.smodus Für normale Blöcke. Die Cursorposition bei Ausführung von
„Mark“ wird als Block-Anfang benutzt. Die aktuelle Cunsorpositlon bei Ausführung einer
Blockoperation gilt als Block-Ende.
Erneutes Ausfuhren von „Mark“ bewirkt eine Desaktivierung des Markierungsmodus.
Kommando :
MarkVert
.Abkürzung
MV
Parameter :
-
Funktion
Aktiviert den Markierungsmotlus für Spaltenblöcke. Erneutes Ausführen von „MarkVert" bewirkt
eine Desaktivierung des Markierungsmodus.
Kommando : Cut
Aliküreung X
Parameter
Funktion ;
Schneidet dem markierten Block aus dem Text aus und kopiert ihn in das ClipBoard. Beendet
den Blockmarkierungsmodus. Der Text vor dem ausgeschnittenen Bereich wird mit dem Text
nach dem ausgeschnittenen Bereich ausammengefügt.
MaxonPASCAL
268
Kommando
Abkürzung
Parameter
Funktion
Copy
C
Kopiert den markierten Block in das ClipBoard. Beendet den Blockmarkierungsmodus.
Kommando : Paste
•Abkürzung V
Parameter
Funktion
Fügt den im ClipBoard gespeicherten Text an der momentanen Cursorposition ein.
Anschließend wird der Cursor auf das letzte eingefügte Zeichen positioniert.
Kommando : PasteVert
Abkürzung PV
Parameter
Funktion
Fügt die im ClipBoard gespeichene Textspalte korrekt an der momentanen Cursorposition ein.
Anschliessend wird der Cursor auf das letzte eingefügte Zeichen positioniert.
Kommando
Abkürzung
Parameter
Funktion
SaveClip
SC
p«=OPT_STRING
Speichert Text aus dem ClipBoard in einer Datei mit Namen p". Wird p" nicht oder nur ein Leer-
String für p" angegeben, so wird der Name der Datei über einen Dateiauswahlfenster vom
Benutzer abgefragt.
Kommando
.Abkürzung
Parameter
Funktion
OpenClip
OC
p"=OPT_STRING
Ladt Text aus der durch p" angebenen Datei und kopien ihn in das ClipBoard. Wird p“ nicht
oder nur ein Leer-String für p“ angegeben, so wird der Name der Datei über einen
Dateiauswahlfenster vom Benutzer abgefragt.
Anhang
269
Kommando : BlockSL
Abkürzung BSl
Parameter
Funktion :
Rückt alle markierten Zeile eines Blocks um eine Tabulatorweite nach links, falls vor jeder Zeile
mindestens ein Tab-Zeichen, bzw, entsprechend viele Leerzeichen sind.
Kommando
Alrkiirzung
Parameter
Funktion
BlockSR
BSr
Rückt alle markienen Zeile emes Blocks um eine Tabulatorweite nach rechts.
Kommando : BlockLower
Abkürzung BLo
Parameter : -
Funktion :
Wandelt alle markierten Zeichen eines Blocks in Kleinbuchstaben um.
Kommando : BlockHigher
Abkürzung BHi
Parameter
Funktion
Wandelt alle markierten Zeichen eines Blocks in Großbuchstaben um.
MaxonPAJSCAl,
270
D-5 Suchen und Ersetzen
Kommando
■Abkürzung
Parameter
Funktion
Find
f
p“= STRING
Sucht ausgehend von der aktuellen Cursorposition die durch p'' angebene Zeichenkette im
Text. Dabei wird solange in eine Richtung gesucht bis ein Vorkommen der Zeichenkette gefun¬
den werden konnte. Ansonsten wird die Suchrichtung umgekehrt und abgebrochen.
Kommando
■Abkürzung
Parameter
Funktion
Rcplace
r
p“=STRING, p‘=STRING
Sucht ausgehend von der aktuellen Cursorposition die durch p" angebene Zeichenkette im
Text. Dabei wird solange in eine Richtung gesucht bis ein Vorkommen der Zeichenkette gefun¬
den werden konnte. Ansonsten wird die Suchrichtung umgekehrt und abgebrochen.
Konnte p'^ gefunden werden, so wird sie durch die mit p' angegebene Zeichenkette ersetzt.
Kommando : Again
Abkürzung a
Parameter
Funktion :
Wiederholt die letzte Such- bzw. Ersetzungsoperation.
Kommando
■Abkürzung
Parameter
Funktion
ReplaceAU
ra
p"=STRlNG, p‘=STRlNG
Ersetzt alle Vorkommen von p" im Text durch die Zeichenkette pf
Anhang
271
Kommando ; RemTab
AbkLii7.ung rt
Parameter
Funktion :
Ersetzt alle Tabs im Text durcti entsprechend viele Spaces.
Kommando : GoMalchStruct
Abkürzung GMS
Parameter
Funktion :
Der Cursor muß sich vor Ausführung von „GoMatchStruct“ auf einer beliebigen öffnenden oder
schließenden Klammer befinden. „GoMatchStruct“ bewegt den Cursor dann auf die korrespon¬
dieren Klammer.
Kommando : GoParsedEiror
Abkürzung GPE
Parameter
Funktion :
Der Cursor muß sich auf der Zeile einer von einem Compiler erzeugten Fehlerdatei befinden, in
welcher der Dateiname und die Zeilennummer eines Fehlers stehen. „GoParsedError“ analysiert
diese Zeile und prüft, ob die Datei, zu der die Fehlerbeschreibung gehört, sich schon im
Speicher befindet. Ist dies nicht der Fall, so wird die entsprechende Datei nachgeladen.
Daraufhin wird der Cursor auf die Zeile positionie«, in welcher sich der angebene Fehler befin¬
det.
Kommando : Jump
Abkürzung J
Parameter p"=VALUE
Funktion ;
Positioniert den Cursor auf die durch p” angegebene Zeile.
MaxonPASCAL
272
D-6 Strukturieren von Texten
Kümmandn : Fold
Abkürzung Fo
Parameter
Funktion
Faltet einen markierten Block zusammen.
Kommando
Al)kürzung
Parameter
Funktion
ShowFold
SF
Befindet sich der Cursor auf einer geschlossenen Falte, so wird diese hierdurch geöffnet.
Kommando : RemFold
Abkürzung rf
Parameter
Funktion
Befindet sich der Cursor auf der ersten Zeile einer Falte, so wird die Falte durch .,RemFold“
geöffnet, und die Faltenmarkierungen werden entfernt.
Kommando : SetFoldsOff
Abkürzung SFO
Parameter
Funktion
Sorgt dafür, daß geschlossene, gefaltete Bereiche mit allen Zeilen genau wie geöffnete, gefaltete
Bereiche dargestellt werden.
Kommando : SetFoldsOn
Abkürzung SFl
Parameter
Funktion
Macht „SetFoldsOff' rückgängig. Danach werden nur noch explizit mit „ShowFold" geöffnete
Falten auch als geöffnet daigestellt.
Anhans
273
Kommando GoPredFold
,\bküi7ung GPF
Parameter
Funktion
Bewegt den Cursor auf den niiehstliegenden Faltenanfang oder das näcfistliegende Faltenende
vor der aktuellen Zeile.
Kommando ; GoSuccFold
Abkür/tung GSF
Parameter :
Funktion
Bewegt den Cursor auf den nächstliegenden Faltenanfang oder das nächstliegende Faltenende
nach der aktuellen Zeile.
Kommando : ToggleKey
Abküraung TK
Parameter
Funktion
Ändert den Auszeichnungsstatus der aktuellen Zeile. Ist diese ausgezeichnet, so wird die
Au.szeichnung gelöscht und umgekehrt.
Kommando : GoPredKey
■Abkürzung GPK
Parameter
Funktion
Bewegt den Cursor auf die nächste vor der aktuellen Zeile liegende Zeile, die au.sgezeichnet ist.
Kommando : GoSuccKey
Abkürzung GSK
Parameter
Funktion
Bewegt den Cursor auf die nächste der aktuellen Zeile folgende Zeile, die ausgezeichnet ist.
MaxonPASCAL
274
Kommando : SetBookMark
Abküßung SBM
Parameter p“=VALUE
Funktion
Belegt daa Lesezeichen mit der Nummer p" mit einem Verweis auf die aktuelle Zeile, so daß die¬
se einfach wieder angesprungen werden kann.
Kommando : GoBookMark
Abkürzung GBM
Parameter p°=VALUE
Funktion
Sucht, ob das Lesezeichen mit der Nummer p“ einen Verweis auf eine Zeile enthält und positio¬
niert dann den Cursor auf diese.
AnhanB
275
D-7 Ändern von Optionen für den aktuellen Text
Kommando : SetTab
Abkürzung
Parameter p"=VALUE
Funktion :
Setzt die Tabulator-Weite auf p". p" mulS im Bereich von 1 bis 20 liegen.
Kommando : SetOverOn
.Airkürzung SOI
Parameter :
Funktion
Aktiviert den „OverWrite“-Modu.s.
Kommando : SetOverOff
Abkürzung SOO
Parameter :
Funktion :
De.saktiviert den „OvcrWrite“-M(xlus.
Kommando : SetWrap
.Airkürzung SWr
Parameter p''=VALUE
Funktion
Setzt den rechten Rtind für den Umbruch im „Word-Wrap“-Modus auf p“. p" muß größer als 9
.sein.
Kommando : SetWrapOn
Abküizung swl
Parameter
Funktion
Aktiviert den ,,Word-WTap“-M(rdus.
MaxonPASCAL
276
Kommando : SetWrapOff
Abkürzung swO
Parameter
Funktion
Desaktiviert den „Word-V!'rap“-Modus.
D-8 Word-Wrap
Kommando : WrapPara
Abkünung WrP
Parameter
Funktion
Formatiert den aktuellen Absatz gemäß den Einstellungen für den „Word-Wrap“ um.
Kommando : WrapText
Abkürzung WrT
Parameter
Funktion :
Formatiert den aktuellen Text gemäß den Einstellungen für den „Word-Wrap" um.
Anhang
277
D-9 Makros
Kommando : RecStart
Al)küi7ung rst
Parameter
Funktion :
Leitet die Aufzeichnung eines Makros ein. Das zuletzt aufgezeichnete Makro geht dadurch verlo¬
ren.
Kommando : RecStop
Abkürzung rsp
Parameter
Funktion
Beendet die Aufzeichnung eines Makros.
Kommando : RecPlay
Abkürzung RP
Parameter
Funktion
Spielt ein aufgezeichnetes oder eingeladenes Makro ab.
Kommando : SaveRecScript
Abkürzung SRS
Parameter p“=OPT_STRING
Funktion :
Speichert ein aufgezeichnetes Makro in einer Datei mit Namen p” ab.
Wird p“ nicht oder nur ein Leer-String für p" angegeben, so wird der Name der Datei über einen
Dateiauswahlfenster vom Benutzer abgefragt.
Kommando
Abkürzung
Parameter
Funktion
PlayRecScript
PRS
p"=OPT_STRING
MaxonPASCAL
278
Lädt die durch p" angegebene Makro-Datei ein, interpretiert diese und fuhrt sie aus. Wird p”
nicht oder nur ein Leer-String für p“ angegeben, so wird der Name der Datei über einen
Dateiauswahlfenster vom Benutzer abgefragt.
D-10 Fenster
Kommando : NewWin
.Abkürzung NW
Parameter
Funktion
Eröffnet ein neues Fenster.
Kommando : FreeWin
Allkürzung FW
Parameter
Funktion
Schließt das aktuelle Fenster. Falls das aktuelle Fenster das letzte Fenster Edw'ards war, so wird
Edw'ard beendet.
Kommando : PredWin
Abkürzung PW
Parameter :
Funktion
Wählt das Window vor dem aktuellen Window an oder, falls dieses das erste Window in der Li.ste
war, das letzte.
Kommando ; SueeWin
Aliküaung SW
Parameter
Funktion :
Wählt das Window nach dem aktuellen Window an oder, falls dieses das letzte Window in der
Liste war, das erste.
Anhang
279
Kommando : SplitHorWin
Abkürzung SHW
Parameter
Funktion
Teilt das aktuelle Fenster horizontal in zwei gleichgroße Fenster auf.
Kommando SplitVerWin
Abkürzung SVW
Parameter
Funktion
Teilt das aktuelle Fenster vertikal in zwei gleichgroße Fenster auf
Kommando ; FuUSizeWin
Allkürz,ung FSW
Parameter
Funktion
Vergrößert das aktuelle Fenster auf maximale Ausmaße.
D-11 Verlassen des Editors
Kommando : Exil
.Abkürzung Xlt
Parameter
Funktion
Edward verlassen. Informationen zur Aufnahme der Arbeit in derselben Umgebung, wie vor
dem Aufruf von „Exit“ werden gespeichert.
Kommando ; Quil
Abkürzung Q
Parameter
Funktion
Edward sofort verlassen.
MaxonPASCAL
280
D -12 Formulare
Kommandü : FindForm
Abkürzung FFm
Parameter
Funktion
Öffnet das Such-Formular.
Kommando FindRepForm
Abkürzung FRFm
Parameter
Funktion
Öffnet das Formular zum Suchen und Ersetzen,
Kommando : GotoFonn
Abkürzung GFm
Parameter
Funktion
Öffnet das Formular, mit welchem eine spezielle Zeile angesprungen werden kann.
Kommando : GlobalForm
Abkürzung GFm
Parameter
Funktion
Öffnet das Formular für die globalen Einstellungen.
Kommando : PageFonn
Airkürzung PFm
Parameter
Funktion
Öffnet das Formular, in welchem den Ausdruck von Texten betreffende Einstellungen votge-
nommen werden können.
Anhang
281
Kommandü : EditFonn
Abkürzung EdFm
Parameter :
Funktion :
Öffnet das Formular, mit dem den aktuellen Text betreffende Einstellungen vorgenonimen wer¬
den können,
Kommando : InfoForm
Abkürzung InfFm
Parameter :
Funktion :
Öffnet das Formular mit Informationen über Edw'ard,
D-13 Der Kommandozeilen-fnterpreter
Kommando : RepeatCnid
Abkürzung RpCmd
Parameter :
Funktion
Führt die zuletzt eingegclxme Kommandozeile erneut aus.
Kommando : EnterCnid
Abkürzung ECmd
Parameter
Funktion
Wechselt in den Fangabemodus ftir die Kommandozeile. Ist dieser Eingabemodus aktiv, so
bricht erneutes Ausführen von „EnterCmd“ den Eingabemodus ab, ohne daß die eingebene
Zeile ausgeführt wird.
MaxonPASCAL
282
Kümmandu : ModilyOldCmd
Abkürzung MCmd
Parameter
Funktion :
Wechselt in den F-ingabemtxlus für die Kommandozeile, wobei die zuletzt eingegebene
Kommandozeile erneut zur Bearbeitung bereitgestellt wird. Ist dieser Eingabemodus aktiv, so
bricht erneutes Ausfuhren von „ModilyOldCmd“ den Eingabemodus ab, ohne daß die eingebe-
ne Zeile ausgeführt wird.
Kommando : Do
Abkürzung Do
Parameter p''=VALUE, p'=CMDUST
Funktion
Führt die durch p' angegebene Kommandofolge p“-mal aus.
D-14 Ändern von globalen Einstellungen
Kommando : Display
Abkürzung Dsp
Parameter p“=VALUE
Funktion
Durch „Display“ wird der Screen gewählt, auf welchem die Fenster von Edward erscheinen sol¬
len. Dabei.sind die Werte von p" folgendermaßen zugeordnet;
0 = Workbench-Screen
1=4 farbiger Screen, Hires
2=4 farbiger Screen, Hires-lnterlaced
Übrigens - sollten Sie einmal einen anderen Screen als den Workbench-Screen eingeschaltet
haben, bekommen Sie Edward nur mit dem Kommando DSP 0 wieder zurück auf den
Workbench-Screen.
283
Anhang
Kommando :
Font
Allkürzung
Fnt
Parameter
p''=STRING, p'=VALUE
Funktion
p" muß den Namen eines Zeicliensat7X-s angeben (Bsp. „topaz.font“). p‘ gibt die gewünschte Größe
des Zeichensatzes an. Bei der Auswahl der Zeichensätze gelten gewisse Einschränkungen. So sind
z.B. keine proportionalen Zeichensätze möglich. Sollte Edward aus irgendeinem Grund einen
gew'ünschten Zeichensatz, für ungeeignet halten, so wird der zuvor eingestellte Zeichensatz weiter¬
hin verwendet.
Kommando : AuloMode
Allkürzung Auto
Parameter : p“=VALUE, ])'=OPT_VALUE
Funktion
p" wählt das Verfahren für den Auto-Save, p' gibt optional die Zeitspanne in Sekunden zwischen
zwei Sicherungen an. p' muß einen Wert größer oder gleich 30 haben.
Die Werte von p" entsprechen folgenden Modi:
0 = Auto-Save OFF
1 = Auto-Save (automatisch speichern, ohne Bestätigung)
2 = Conflrm Auto-Save (automatisch speichern, aber erst nach Bestätigung)
Kommando
Abkürzung
Parameter
Funktion
OpenDeüs
OD
p“=OPT_STRING
Die Definition der Menüs, Tastaturbelegung, des HotKeys, etc. wird aus der durch den String pO
spezifizierten Datei geladen. Wird kein String angegeben, so öffnet sich ein
Dateiau.swahlfenster, mit dem eine Datei gewählt w'erden kann.
MaxonPASCAL
284
D-15 ARexx - Kommunikation mit Edward
Kommando
Abkürzung
Parameter
Funktion
ExecRexx
RX
p“=OPT_STRING
Führt die durch p" angebene Datei als Rexx-Programm aus. Wird p" nicht oder nur ein Leer-
String für p" angegeben, so wird der Name der Datei über einen Dateiauswahlfenster vom
Benutzer abgefragt.
Kommando ExecRexxStiing
Abkürzung RXS
Parameter p“=STRING
Funktion
Führt den übergebenen String p“ als kleines Rexx-Programm aus.
D-15.1 Abfrage von Statuswerten Edwards :
Kommando : GetWord
Abkürzung GWd
Parameter
Return SMALL_STRING
Funktion
Uefert das Wort, auf welchem sich der Cursor befindet zurück.
Kommando ; GetlineString
Abkürzung LineString
Parameter
Return STRING
Funktion
Gibt den Inhalt der aktuellen Zeile zurück.
Anhang
285
Kommando :
GetTextPos
Abkürzung
TextPos
Parameter :
-
Return
LIST „(LineNum, DispPos, DispLineNum, EdStringPos, Fold,
FoldStart, FoldEnd, Key, EndLF, EndEOS)“
Funktion
Liefert eine Liste, die die Position im Dokument und Status-Informationen enthält,
Autbau der Liste:
• Zeilennummer; ergibt sich durch .Abzählen aller Zeilen vom Textanfang an,
• Spaltenposition
• Zeilennummer; ergibt sich durch Airzählen nur der sichtbaren Zeilen (d,h,: die eingefalteten
Zeilen werden nicht mitgezählt),
• Position im String der aktuellen Zeile, die mit der Spaltenposition korrespondiert. Enthält ein
String TAB-Zeichen, so können sich die Spaltenposition und die String-Position untentcheiden,
da ein Tab für die Spaltenposition normalerweise wie mehrere Leerzeichen gezählt wird,
• Fold, Flag; gibt an, ob die Zeile eingefaltet ist,
• FoldStart, Flag; gibt an, ob die Zeile der Beginn einer Falte ist,
• FoldEnd, Flag; gibt an, ob die Zeile das Ende einer Falte ist,
• Key, Flag; gibt an, ob die Zeile ausgezeichnet wurde,
• EndLF, Flag; gibt an, ob die Zeile mit einem LineFeed (ASCII 10) endet,
• EndEOS, Flag; gibt an, ob die Zeile mit einem EOS (ASCII 0) endet,
Kommando : GetTextList
Allkürzung TextList
Parameter :
Return LIST „([TextName ID]*)“
Funktion
Liefert eine Liste aller geladen Texte und ihrer IDs,
Kommando GetWindowList
Ahkür7,ung WindowList
Parameter
Return : LIST „([WindowID TextID Lefit Top Width Height]*)“
Funktion
Liefert eine Liste mit IDs aller geöffneten Windows, sowie dazugehörigen Informationen (ID des
dargestellten Textes, Position und Ausmaße des Fensters),
MaxonPASCAL
286
Kommandi) GetBlocklnfo
Alikür/ung Blocklnfo
Parameter
Return : LIST „(Block, MarkVert, LineNum, DispPos, StringPos)“
Funktion
Gibt Informationen über einen möglichen^’eise markierten Block zurück. Ein markierter Block
wird immer durch die zu Beginn markierte Zeile und die aktuelle Zeile definiert.
Die Uste enthält folgende Werte:
• Block; Flag. Gibt an, ob ein Block markiert ist. Ist dieses Flag 0, so gelten alle folgenden
Informationen nicht.
• MarkVert; Flag. Gibt an, daß der Benutzer einen Spaltenblock markieren will.
• LineNum. Zeilennummer der Zeile, an der die Markiening beginnt (diese kann über-, aber auch
unterhalb der aktuellen Zeile liegen).
• DispPos. Spaltenposition des Markierungsbeginns.
• StringPos. Zu DispPos korrespondierende Position im String der Zeile, an der die Markierung
beginnt.
Kommando : GetTextlnfo
Altkürzung Textinfo
Parameter
Return : LIST „(TotalLines, DispLines, FoldedLines, UseFold, DoWrap,
Over, LockCnt, Changes.)“
Funktion
Liefert allgemeine Informationen ülx;r den aktuellen Text.
Aufbau der Liste:
• TotalLines; Anzahl aller Zeilen des Textes
• DispLines; Anzahl der momentan darstellbaren Zeilen.
• FoldedLines; Anzahl der eingefalteten Zeilen.
• UseFold; Flag. Gibt an, ob Zeilen innerhalb von Falten dargestellt werden soUen ( 0 ) oder
nicht( -1).
• DoWrap; Flag. Gibt an, ob der WordWrap-Modus eingeschaltet ist.
• Over; Flag. Gibt an, ob der OverWrite-Modus eingeschaltet ist.
Anhang
287
• LockCnt; Zähler, wie oft der Text geiocked wurde. Ist er ungleich 0, so kann der Text nicht
modifiziert werden. Der Ixx'kCnt wird hochgezählt, wenn der Text gedruckt werden soll, oder
TextReads auf den Text ausgeführt wertien.
Kommando : GetScreenlnfo
Abkürzung Screenlnfo
Parameter :
Return LIST „(Width Height Depth ScreenAdr)“
Funktion
„Screenlnfo“ gibt folgende Werte in einer Liste zurück:
Breite, Höhe, Tiefe und Adresse des Screens, auf welchem Edward seine Fenster darstellt.
D-15.2 Laden von Texten aus Edward heraus
Mit den folgenden Befehlen ist ein Zugriff auf im Speicher befindliche Texte Edwards auf einfache
und schnelle Weise möglich.
Zu beachten ist hier vor allem, daß ein von einer externen Applikation mit InitTextRead geöffneter
Text bis zum Abschluss der TextRead- Operationen durch EndTextRead nicht verändert werden
kann; der Text ist gesperrt („gelückcd“).
Solange nicht alle InitTextReads durch entsprechende EndTextReads abgeschlossen wurden, kann
zudem Edward nach einem Beenden nicht aus dem Speicher entfernt werden.
Es ist selbstverständlich möglich, mehrere InitTextReads auf den.selben Text auszuführen.
Kommando
Abkürzung
Parameter
Return
Funktion
InitTextRead
ITR
p"=STRING
Handle=VALUE
Versucht Text mit Namen pO zu finden. Ist dieser vorhanden, so wird er geiocked und ein
Handle für w'eitere Operationen erzeugt. Die erste Zeile des Textes ward zur aktuellen Zeile für
kommende TextRead-Operationen. Das Handle wird zurückgegeben.
MaxonPASCAL
288
Kommando
Abküniung
Parameter
Return
Funktion
TextRead
TR
Handle=VALUE, Bu£fer=VALUE, BuffSize=VALUE
RealRead=VALUE
Kopiert von der für diesen TextRead aktuellen Zeile den Inhalt dieser und der folgenden Zeilen
in den Buffer. Dabei werden Zeilen immer komplett kopiert. Sollte eine Zeile nicht mehr ganz
in den Buffer passen (daher muß BuffSize angegeten werden), so w'ird die Kopieraktion been¬
det.
Daraufhin wird die Anzahl der kopierten B«e.s z.uriickgegelien (RealRead). Das Lesen ist been¬
det, w'enn RealRead gleich 0 ist.
Kommando : EndTextRead
Abkürzung ETR
Parameter Handle=VAI.lIE
Return : -
Funktion
Der durch ein „InitTextRead“ gelockte Text wird wieder unlocked. Das Handle wird freigege¬
ben.
D-16 UnDo/ReDo - Zurücknehmen von Textänderungen
Kommando : UnDo
.Abkürzung UnDo
Parameter :
Funktion :
Nimmt die letzte Änderung am Text zurück.
Kommando : ReDo
Abkürzung ReDo
Parameter :
Funktion :
Nimmt die Rücknahme der Rückname der letzten Textänderung zurück.
(Gut, das ist nicht gerade leichverständlich, aber Sie können ja noch einmal in das
Referenzkapitel blättern. Noch besser ist. Sie probieren es einfach aus.)
iVnhans
289
D-17 Verschiedenes
Küinmanclo : ExecCli
.'Vbkürzung Exe
Parameter p"=STRING
Funktion :
Führt das Programm mit Namen p" aus,
Kommando : InsertChars
Abkuryaing : IC
Parameter p'’= STRING
Funktion
Fügt die durch p" spezifizierten Zeichen an der aktuellen Cursorposition ein. Dieses Kommando
\sairde für Makros und die ARexx-Kommunikation eingeführt.
Kommando : SetModel, SetMode2, SetMode3
.Airkürzung : SMl, SM2, SM3
Parameter
Funktion :
Sorgt dafür, daß die nächste Tastatureiitgabe gemäß Modus 1 interpretiert wird.
Kommando : Iconify
Abkürzung Ify
Parameter ;
Funktion
Schließt alle Fenster Edwards. Ein neues Fenster, das nur aus einer Titelzeile besteht erscheint
anschließend. Wird dieses Fenster aktiviert und die rechte Maustaste gedrückt, so werden alle
Fenster Edwards wieder an ihren ursprünglichen Positionen geöffnet. Edward kann ebenfalls
durch den HotKey oder dtis Senden einer Nachricht über ARe.xx „geweckt" w-erden.
MaxonPASCAL
290
E) Editor-Fehlermeldungen.
Beim Arbiter) mit Edward werden Sie bei wichtigen Problemen, die sich ergeben können, augen¬
blicklich informien und erhalten in den meisten Fällen die Möglichkeit, auf diese Informationen zu
reagieren, ln der Regel handelt es sich hier um Sicherheitsabfragen, um zu verhindern, daß Sie z.B.
aus Versehen einen noch nicht abgespeicherten Text löschen.
E-1 Informationen
Meldung : „Markierung gesetzt“
Ursache : Sie haben die aktuelle Zeile mit einem Lesezeichen belegt, um sie demnächst leicht
wieder anspringen zu können.
Referenz : Kapitel 3.7.4 Lesezeichen
E-2 Allgemeine Fehlermeldungen
Meldung : „Text ist geschützt“
Ursache : Sie wollten den Text verändern, dieser ist aber gesperrt. Ein Text wird gesperrt, wenn
er gedruckt werden soll, oder der Befebl „InitTextRead“ auf ihn ausgeführt wurde.
Abhilfe : Warten, bis der Text gedruckt wurde.
Vielleicht wird auch gerade ein AEe,xx-Makro auf diesen Text ausgeführt, dann heißt es
ebenfells abwarten.
Referenz : Kapitel IV. 5) Drucken eines Textes
Kapitel 3.17 ARexx - Kommunikation mit Edward
Meldung : „Kein Pictogramm vorhanden“
Ursache : Wenn Sie im Formular für die globalen Einstellungen „Configuration Icon“ gewählt
haben, versucht Edward zu jedem Text, den Sie erzeugen, eine „.info“-Datei zu schrei¬
ben. Diese Datei enthält unter anderem Informationen, damit die Workbench ein
Pictogramm zu Ihrem Text darstellen kann. Existierte bisher keine „.mfo"-Datei, so
erzeugt Edward eine Standard-Datei. Dazu benötigt er im Verzeichnis „Edward:“ ie
Datei „EdwardDefault.üifo“. Diese haben Sie anscheinend gelöscht.
Anhang
291
.Atihilfe : Kopieren Sie von der mitgelieferten Diskette die Datei „EdwardDefault.info" wieder in
Ihr ,Edward:“-Ver/eichnis, sollte Ihnen das zu kompliziert erscheinen müssen Sie
Edward komplett neu installieren (Achtung: Dabei können möglicherweise verschiede¬
ne von Ihnen vorgenommene Voreinstellungen für Edward verloren gehen).
Referenz : Kapitel 3.15 „Globale Einstellungen“
.Meldung : .Abbruch! Konnte Backup nicht erzeugen!“
Ursache : Sie w'ollten einen Text speichern. Beim Anlegen der Backup-Datei Ihres Textes trat ein
Fehler auf
Möglicherweise haben Sie einen ungültigenPfad für die Backup-Datei angegeben.
Vielleicht ist auch nur das Laufwerk oder die Platte voll, auf welcher Sie die Backup-
Datei anlegen lassen wollten.
Abhilfe : i’lberprüfen Sie den Pfad-Namen, den Sie für die Backup-Datei im „Global Prefs“-
Formular angegeben haben.
Versichern Sie sich, daK auf dem durch den Pfad angegebenen Medium genügend
Speicherplatz vorhanden ist.
Referenz ; Kapitel 3.15 „Globale Einstellungen“
Meldung : „Markierung nicht gesetzt!“
Ursache : Sie haben versucht ein Lesezeichen anziispringen, das noch nicht definien wurde.
Abhilfe : Vielleicht haben Sie nur die falsche Taste gedrückt, dann sollten Sie es einfach nochmal
versuchen.
Referenz : Kapitel 3.7 „Strukturieren von Texten - I^sezeichen“ Abschnitt 4)
Meldung : „Kein Block definiert!“
Ursache : Sie haben versucht eine Block-Operation auszufuhren (Cut, Copy, Paste, etc.) , zuvor
jedoch keinen Bkxk definiert.
Abhilfe : Einfach den gewünschten Text-Bereich markieren und nochmal versuchen.
Referenz : Kapitel 3.5. „Blockoperationen''
Meldung : „Abbruch! Funktion würde FJnfaltung zerstören!“
Ursache : Im allgemeinen wird diese Meldung ausgegeben, wenn Sie einen Block ausschneider
wollten, der nur teilweise eine Text-Falte überdeckt. Bei einer solchen Operation wür
MaxonPASCAL
292
Abhilfe
Referenz
Meldung :
Ursache :
Abhilfe :
Referenz :
Meldung :
Ursache :
Abhilfe :
Referenz :
Meldung :
Ursache :
de nur der Anfang bzw. das Ende der Textfalte ausgeschnitten, was die Falte zerstören
würde. Deshalb unterbindet Edward solche Aktionen.
Sie können eine Textfalte nur komplett ausschneiden. Sollten Sie tatsächlich nur einen
Teil der Textfalte ausschneiden wollen, so müssen Sie die Faltung erst rückgängig
machen, bevor Sie diesen Teil ausschneiden können.
Kapitel 3.5 „Blockoperationen“
„Zeichenkette zu langt“
Aus internen Gründen kann Edward maximal 512 Zeichen in einer Zeile verwalten.
Beim Einfügen von Zeichen durch eine „Paste“-Operation könnte diese Grenze mögli¬
cherweise überschritten werden, was fatale Fehler hervorrufen würde. Daher stoppt
Edward hier das Einfügen und gibt obige Meldung aus.
Die „Paste"-Operation in einer leeren Zeile ausführen.
Kapitel 3-5 „Blockoperationen“
„Suchjuuster nicht gefunden!“
Beim Suchen oder Ersetzen konnte das von Ihnen angegebene Suchmuster nirgendwo
im Text entdeckt werden.
Suchvorgang wiederholen. Edward durchsucht den Text immer von der aktuellen
Position aus entweder zum Anfang oder zum Ende hin nach dem Suchmuster. Konnte
dieses nicht gefunden werden, so kehrt er die Suchrichtung um. Daher kann unter
Umständen nach dem Fehlschlagen einer Suchaktion durch eine Wiederholung des
Suchvorgangs doch noch etwas gefunden w'crden. Schlägt dieser Suchvotgang ebenfalls
fehl. Dann ist beim besten Willen nichts zu finden.
Vielleicht verbirgt sich eine Zeile, deren Inhalt dem Suchmuster entsprechen würde, in
einer Textfalte, dann konnte Edward hier ebenfalls nichts finden. Wählen Sie „Show All
Folds“ aus dem ..Folds“-Menü und wiederholen Sie den Suchvorgang.
Kapitel 4.6. „Suchen und Ersetzen“
„Cursor steht auf keinem Stnikturelement“
Beim Aufruf von „Match Bracket“ aus dem „Search“-Menü stand der Cursor auf keiner
Klammer.
Anhani
293
Abhilfe : Positionieren Sie eien Cursor auf eine Klammer. Wahlen Sie dann erneut „Match
Bracket“.
Referenz : Kapitel 3.6. „Suchen und Ersetzen“
Meldung : „Strukturen stimmen nicht überein!“
Ursache : Nach dem Aufruf von „Match Bracket“ aus dem „Search'‘-Menü konnte Edward keine
korrespondierende öffnende bzw. schließende Klammer finden.
Abhilfe : Überprüfen Sie Ihren Text genau. Sie haben sicher irgendwo eine Klammer vergessen.
Referenz : Kapitel 3.6 „Suchen und Ersetzen“
Meldung : ,aVUes ist rückgängig gemacht worden!“
Ursache : Sie haben „Undo“ aus dem „Extra.s“-Menü so oft ausgewählt, daJS es nichts mehr rück¬
gängig zu machen gibt.
Abhilfe : W'ählen Sie doch mal eine andere Funktion aus und bearbeiten Sie Ihren Text wieder.
Na ja, ' mal ganz ernsthaft. Die obige Meldung Ist eigentlich eher als Hinweis denn als
Fehler zu werten. Nehmen Sie sie einfach zur Kenntnis.
Referenz : Kapitel 3.18 „Zurücknehmen von Text-Änderungen“
Meldung : „Alles ist wiederhergestellt worden!“
Ursache : Sie haben alle Rücknahmen von Text-Änderungen wieder zurückgenommen, das heißt,
Ihr Text sieht wieder genauso aus, wie vor dem ersten Aufruf von „Undo“.
Abhilfe : Siehe oben.
Referenz : Kapitel 3-18 „Zurücknehmen von Text-.Änderungen“
Meldung ; „Menü ist zu groß für den Screen! Nutze Default Einstellungen!“
Ursache : Ihr Systemfont ist derart hoch, daß meist die Höhe des Menüs (in seltenen Fällen wird
das Menü so breit, dalJ es in der horizontalen nicht meirr paßt) größer wird, als auf dem
Screen angezeigt werden kann.
Airhilfe : Sie sollten keine tJbertrieben großen Fonts verwenden, um noch etwas auf Ihrem
Monitor erkennen zu können. Kaufen Sie sich besser einen größeren Monitor!
MaxonPASCAL
294
E-3 Fehlermeldungen mit Abfragen
Meldung : „[l][Vorsicht: Kein Speicher mehr! | Texte entfernen| oder Programm verlas-
sen.][OK]“
Ursache : Edward hat leider nicht genügend Speicher bekommen.
Abhilfe : Sicherheitshalber sollten Sie alle Texte erst einmal abspeichem. Wenn Sie dann einen
oder mehrere der mttmentan nicht mehr benötigten Texte löschen, dann haben Sie für
‘s erste genügend Speicher zum Weiteratbeiten. Sollte diese Meldung öfter auftreten,
dann ist der Kauf einer Speichererweiterung mehr als nur ratsam.
E-4 Meldungen mit Abfragen
Meldung ; „Geänderten Text verwerfen ?
[Ja] [Nein]“
Ursache : Sie wollten eine Operation vornehmen, deren Ausführung dazu führen würde, daß der
momentan aktuelle Text verloren geht (z.B.: „Open“ aus dem „Projekf'-Menü oder
„Neu“ bzw. „Frei“ aus dem „Text“-Menü).
Falls dieser Text von Ihnen verändert, aber nicht abgespeichert wurde, so erfolgt diese
Meldung. Wenn Sie „Nein“ wählen, so wird die Operation abgebrochen und Sie können
den Text danach abspeichern, bei ,Ja“ geht dieser Text unwiederbringlich verloren.
Abhilfe : Vor einer der oben erwähnten Operationen den Text abspeichem. Dies ist allerdings
nicht zwingend notwendig. Die obige Meldung dient ja gerade dazu. Schlimmeres zu
verhindern, wenn Sie das Abspeichem einmal vergessen sollten.
Referenz : Kapitel 3-3 „Text", Kapitel 3.4 „Dateioperationen“
Meldung : „Geänderten Text verwerfen ?
[Ja] [Nein]“
Ursache ; Sie wollten Edward beenden, Itaben aber noch nicht alle geänderten Texte abgespei¬
chert.
Abhilfe : Wählen Sie ,Ja“, dann wird Edward beendet und alle von Ihnen bearbeiteten Texte wer¬
den nicht abgespeichert und gehen verloren. Da dies normalerweise nicht gewünscht
ist sollten Sie „Nein“ wählen und dann die entsprechenden Texte abspeichem.
Referenz : Kapitel 3-4 „Dateioperationen“
Anhang
295
Meldung ; .Altes Pictogramm ersetzen ?
Ua] [Nein]“
Ursache : Sie haben eine I>atei ^arbeitet, zu der ein Icon existiert, das nicht von Edward erzeugt
ftoirde. Dies ist z.B. möglich, wenn Sie eine Script-Datei eines anderen Programmes
bearbeiten. Da viele Programme in der „.info“-Datei die das Icon enthält wichtige
Zusatzinformationen speichern (diese können Sie sich durch einfaches Anklicken des
Icons und Wahl des Menüpunktes „Info“ aus einem Menü der Workbench anzeigen las¬
sen) sollten Sie bei dieser .Meldung vorsichtshalber „Nein“ wählen. Nur wenn Sie ganz
sicher sind, daß die „.info“-Datei keine wichtigen Informationen enthält wählen Sie ,Ja“,
dann überschreibt Edward diese Datei mit seiner eigenen „.info''-Datei, die
Informationen über das gerade bearbeitete Dokument enthält.
Althilfe : Vergewissern Sie sich vor der Bearbeitung einer Datei, ob eine „.info“-Datei zu Ihr exi¬
stiert und ob diese von Edward oder einem fremden Programm erzeugt wurde. Ist letz¬
teres der Fall, so sollten Sie mit dem „Info“-Menü der Workbench erkunden, ob diese
Datei irgendwelche wichtigen Zusatzinformationen enthält.
Referenz : Kapitel 3-4 „Dateioperationen“,
Kapitel XVI. „Globale Einstellungen“ Abschnitt I) „Das 'Global Prefs’-Formular“
Meldung : „Datei speichern : ‘Name’
IJalNein]“
Ursache : Sie haben im „Global Prefs“-Formu]ar die Option „Confirm Autosave“ eingestellt. Dies
bedeutet, daß Edward nach dem von Ihnen eingestellten Zeitintervall alle Texte über¬
prüft und dann versucht, die geänderten Texte abzuspeichern. Vorher holt er sich
jedoch von Ihnen über obige Meldung die Erlaubnis.
Abhilfe : Wenn Sie diese Abfrage stört, dann wählen Sie statt „Confirm Auto-Save“ die Option
,Auto-Save“, dann werden geänderte Texte automatisch ohne Rückfrage gespeichert.
Referenz : Kapitel 3.15 „Globale Einstellungen“ Abschnitt 1) „Das 'Global Prefs’-Formular“
Meldung : „Datei existiert bereits
Überschreiben?
[Ja] [Nein]“
Ursache : Vermutlich haben Sie nach Wahl des Menüpunktes „Speichern als...“ aus dem „Projekt“-
Menü im Datei-Auswahlfenster den Namen einer Datei gewählt, die schon existiert.
Diese würde von momentan aktuellen Text überschrieben, wenn Sie ,Ja“ wählen und
MaxonPASCAL
296
j'inge auf ewig verloren. Um dies zu verhindern erfolgt die Rückfrage Edwards. Wenn
Sie sicher sind, tlaß sie die schon existieren Datei überschreiben wollen, dann wählen
Sie ,Ja". Normalerweise Lst es wohl sinnvoller ..Nein“ zu wählen und sich die entspre¬
chende Datei erst einmal genauer anzuschauen.
Referenz : Kapitel .14 „Dateioperationen''
E-S Fehler bei Betriebssystemoperationen
■Meldung : „Kein Speicher mehr!“
Ursache : Sie leiden unter Speicherverknai^pung. Edward kann in diesem Fall die von Ihnen
gewünschte Operation nicht korrekt ausführen.
Abhilfe : Kurzfristig ist es sinnvoll für mehr Speicher zu sorgen, indem sie nicht mehr bendtigte
Programme die momentan ebenfalls laufen beenden. Weiterhin können Sie Texte, die
Sie nicht weiter bearbeiten möchten, mit „Frei“ aus dem „Text''-Menü wieder freigeben
und hierdurch ebenfalls etwas Speicher gewinnen.
Langfristig empfiehlt sich wohl die Anschaffung einer R.AM-Erweiterung.
Meldung : „Kann Datei nicht öflfnen“
Ursache : Edward versuchte eine von Ihnen angegebene Datei zum Liden oder Speichern zu öff¬
nen. Dieser Versuch schlug fehl. Eine mögliche Ursache währe, daß diese Datei
momentan von einem anderen Programm bearbeitet wird. Dies ist zum Beispiel mög¬
lich, wenn gerade ein Compiler diese Datei ütersetzt.
Aldiilfe : In olxtn erwähntem Fall empfiehlt es sich, zu w'arten, bis der Compiler seine .Arbeit
beendet hat und dann erneut zu versuchen, diese abzuspeichern. .Ansonsten sollten Sie
versuchen die Datei unter einem anderen Namen, möglicherweise auch auf einem
anderen kufwerk abzuspeichern.
Meldung : „Kann nicht speichern“
Ursache : Beim Schreiben einer Datei schlug irgendetwas fehl.
Abhilfe ; Überprüfen Sie, daß das l.aulwerk auf welchem Sie die Datei speichern wollten genü¬
gen Speicherplatz bietet und kein Schreibschutz aktiviert ist. Sollte dies nicht der Fall
sein, so wechseln Sie das Laufwerk, oder deaktivieren den Schreibschutz.
Anhani
297
Meldung : „Kann Info-Datei nicht speichern“
Ursache : Das Betriebssystem konnte die „.infb“-Datei zu Ihrem Text nicht erzeugen.
Abhilfe : s. oben.
Meldung : „Fehler beim Lesen“
Ursache : Vv^ahrend des lesens einer Datei trat ein Fehler auf. Möglicherweise sind Daten auf dem
entsprechenden Laufwerk defekt.
Airhilfe : Versuchen Sie mit einem Programm wie DiskDoctor zu retten, was noch zu retten ist.
Viel Glück!
Wenn Sie wie empfohlen fleißig Backups Ihrer Arbeiten gemacht haben, dann dürften
Sie in dieser Situation nicht viel verloren haben.
Meldung : „Konnte Datei nicht speichern“
Ursache : Beim speichern einer Datei schlug irgendetw'as fehl.
.Airhilfe : s. „Kann nicht speichern“
Meldung : „Konnte Formular nicht öffnen“
Ursache : Edward versuchte ein von Ihnen gewünschtes Formular zu öffnen. Dies schien dem
Betriebssystem nicht möglich zu sein. Normalerweise ist ein Mangel an freiem Speicher
(insbesondere CHIP-Memcrry) an diesem Verhalten schuld.
.Abhilfe ; Für freien Speicher sorgen (s. „Keinen Speicher mehr“).
E-6 Eingabefehler
Meldung : „Wrap-Position darf nicht kleiner als 10 sein!“
Ursache : Sie haben wahrscheinlich in der Kommandtrzeile eine Wrap-Position kleiner als 10
Zeichen setzen wollen. Da dies nicht .sehr sinnvoll ist hat Edward dies unterbunden.
Abhilfe : Eine Position größer oder gleich zehn Zeichen angeben.
Referenz : Kapitel 3.9 „Word-Wrap“
MaxonPASCAL
298
Meldung : „Tabulatorwert nur zwischen 1 bis 20“
Ursache : Sie haben versucht einen Wert für die Größe des Tabulatorabstandes anzugeben, der
als nicht sinnvoll erachtet wird.
Abhilfe : Sinnvollen Wert zwischen Eins und Zwanzig angeben.
Referenz : Kapitel III. „Eingabe und Bearbeitung von Texten“ Abschnitt 4) RETURN, ENTER und
TAB
Kapitel 3.15 „Globale Einstellungen“ .Abschnitt 1) „Das ‘Global Prefs’-Formular“
Meldung : ^Auflösungen nur im Bereich von 0 bis 2“
Ursache : Sie versuchten einen ungültigen Wert für den Display-Typ anzugeben.
Abhilfe : Wert zwischen Null und Zwei angeben.
Referenz : Kapitel 3-15 „Globale Einstellungen“ Abschnitt 1) „Das ‘Global Prefs’-Formular“
■Meldung : „Zeiten kleiner 30 Sek. machen keinen Sinn!“
Ursache : Die künstliche Intelligenz Edwards hält Intervalle unter dreissig Sekunden für die
,Auto-Save“-Funktion für nicht besonders sinnvoll. Wahrscheinlich haben Sie einen
Wert unter dreissig Sekunden nur aus Versehen angegeben.
.Abhilfe : Werte größer dreissig angeben.
Referenz : Kapitel 3.15 „Globale Einstellungen“ Abschnitt 1) „Das ‘Global Prefs’-Formular“
Meldung : jVutomode-Bercich nur von 0 bis 2!“
Ursache : Sie haben einen ungültigen Wert für den ,„Auto-Save“-Modus angegeben.
Abhilfe : Wert zwischen Null und Zwei angeben.
Referenz : Kapitel 3.15 „Globale Einstellungen“ Abschnitt 1) „Das 'Global Prefs’-Formular“
£-7 Fehler in den Definitionsdateien
Als Referenz zu diesem Abschnitt empfiehlt es sich, das Kapitel XX. „Benutzerdefinierte Menüs,
Tastaturbelegung und HotKey“ zu lesen.
Anhang
299
Nteklung : „Präprocessor-Befehl zu komplex“
Ursache ; ln einer Defmiions-Datei, welche die Menüs und die Tastaturbelegung Edwards enthält
trat eine übermälSig komplexe Verschachtelung von „#iP‘-Statements auf. Da Edward
hier nur eine Tiefe von maximal 16 beherrscht, hat er hier das Handtuch geworfen.
Al:)hilfe : Formulieren Sie ihre Definitons-Dateien etwas weniger komplex. Es erscheint schon
fast unglaublich, daß Sie selbst diese Schachtelungstiefe verstehen können.
Meldung : „#endif ohne #if‘
Ursache ; Sie haben ein #endif in ihrer Datei, zu dem kein #if gehört.
Allhilfe : Überprüfen Sie die Datei noch einmal genau.
Meldung : „Präprocessor-Befehl erwartet“
Ursache : Sie haben in der Datei ein „#''-Zeichen an einer Steüe verwendet, an welcher der
Präprozessor dieser bearbeitet. Dieser erwartet nach dem „#“-Zeichen ein Statement
(„if‘, „endif‘ oder „eise“).
Abhilfe : Überiirüfen Sie die Datei. Entfernen Sie das Zeichen, oder ergänzen Sie das entspre¬
chende Statement.
Meldung : „TITLE erwartet“
Ursache : Sic haben in der Datei versucht ein Menü zu definieren, daß jedoch keinen einzigen
Titel enthält.
Abhilfe
Die entsprechende Stelle der Datei untersuchen. Vielleicht haben Sie den „T1T1J-“
Befehl j;i einfach nur vergessen. Sollten Sie zu den Puristen gehören, die vollständig auf
Menüs verzichten können und alles mit der Tastatur machen, dann entfernen Sie auch
noch den „MENU“-Befehl aus der Datei.
Meldung : „Zu viele Menüeinträge“
Ursache : Sie haben versucht, ein Menü mit mehr als zwanzig Einträgen zu erzeugen. Dies ist lei¬
der nicht möglich.
Allhilfe : Die Einträge auf mehrere Menüs verteilen.
MaxonPASCAL
300
Meldung : „Zu viele Menütitel“
Ursache : Sie haben versucht, mehr als 16 Menüs zu erzeugen. Dies ist leider nicht möglich.
.Abhilfe : Beschränken Sie sich etw'as in Ihren Menüs.
E-8 Fehler beim Analysieren von Kommandos
Fehlermeldungen in Definitions-Dateien oder in Kommandozeilen folgt immer eine Angaben der
Position, an welcher der entsprechende Fehler auftrat. Die Fehlermeldungen haben daher folgen¬
den Form:
1. Fehler
In Zeile ; Zeile x Column: Spalte
oder
2. Fehler
In Spalte: Spalte
Meldung : „IDENTIFIER erwartet“
Ursache : Es wurde ein IDENTIFIER erwartet, aber nicht gefunden.
Ein IDENTIFIER beginnt mit einem Buchstaben, gefolgt von einer beUebigen Anzahl
alphanumerischer Zeichen (also Buchstaben und Ziffern) gemischt mit dem Unterstrich
Meldung : „STRING erwartet“
Ursache : Es wurde ein STRING erwartet. Ein String beginnt mit einem Hochkomma („) gefolgt
von einer beliebigen Anzahl Zeichen und wird mit einem Hochkomma abgeschlo.ssen.
•Meldung : „NUMBER erwartet“
Ursache : An dieser Stelle wurde eine Zahl erwartet.
Meldung : „( erwartet“
Ursache : Es wurde eine öffnende, runde Klammer erwartet.
Anhani
301
Meldung : „) erwartet“
Ursache : Eine schliessende, runde Klammer wurde erwartet.
Meldung : erwartet“
Ursache : Es wurde eine Semikolon erwartet.
Meldung : „Kein Befehl“
W» Ursache : Es wurde ein Kommando aus Edw'ards Befehlsvorrat erwartet.
Ahhilfc : Überprüfen Sie die Stelle. Wahrscheinlich haben Sie den Befehl nur falsch ausgeschrie¬
ben.
Meldung : „LIST oder IDENTIHER erwartet“
Ursache : Es wmrde eine LIST oder ein IDENTIFIER erwartet, aber nicht gefunden.
Eine LIST wird von runden Klammern umschlossen. Zwischen diesen können sich
IDENTIFIER, STRINGs, NUMBERs, COMMANDs oder USTs auch gemischt befinden,
Meldung : „LOBJECT erwartet“
Ursache : Es wurde ein LOBJECT erwartet. Ein LOBJECT kann ein STRING, eine NUMBER, ein
COMMAN'D oder eine LIST sein.
E-9 Fehlermeldungen beim Auswerten von Kommandos
„LVAL erwartet“
Ursache ; Ein LVAl., das bedeutet eine Zahl wurde von einem Kommando als Argument erwartet.
Meldung : „Zu viele Argumente“
Ursache : Ein Kommando wurde mit zuvielen Argumenten versorgt.
Meldung : „Falsches Argument“
Ursache : Ein Kommando wurde mit falschen Argumenten versorgt.
MaxonPASCAL
302
F) Kurzübersicht
1.) Wort-Symbole (reserviert Pascal-Schlüsselwörter):
AND
AR RAY
BEGIN
OASE
CONST
DIV
DO
DOWNTO
ELSE
END
FILE
FOR
FUNCTION
GOTO
IF
IN
LABEL
MOD
NIL
NOT
OF
OR
PROCEDURE
PROGRAM
PACKED
RECORD
REPEAT
SE
SHL
SHR
THEN
TO
TYPE
UNTIL
VAR
WHILE
WITH
XOR
Diese Liste entspricht (außer SHL, SHR und XOR) dem Jensen-Wirth-Standard.
2.) Direktiven:
ABSOLUTE
FROM
LIBRARY
UNIT
EXPORT
IMPLEMENTATION
MODU LE
USES
EXTERNAL FORWARD
IMPORT INTERFACE
OTHERWISE STATIC STRING
Der Jensen-Wirth- (ISO 7185-) Standard kennt nur eine Direktive, nämlich FORWARD (die
Direktives in diesein Sinn sind nicht zu verwechseln mit den Compiler-Direktiven wie z.B.
{$ind...} 1) Direktiven sehen zw'ar auf den ersten Blick wie Wonsymbole aus, werden aber compile¬
rintern wie Bezeichner (Identifler) behandelt.
Dadurch können sie z.B. vom Programmierer „überdefiniert“ werden, d. h. Sie können eine Variable
„Forward“ cxler einen Datantypen „String“ nennen, letzteres wird in der Tat auch häufig in
Standard-Pascal-Prngrammen getan („TYPE String=packed .\rray[l..xxx| of Char“ ist eine sehr
Ixtliebte Deklaration). Aus diesem Grunde wurden auch die MaxonPASCAL-typischen
Schlüsselwörter wie „STRING“ oder „LIBRARY' in Form von Direktiven realisiert.
Anhan;
303
3.) Konstanten
true
false
MaxInt = 32767
MaxLong =2147483647
MaxLongInt '=2147483647
MaxCard = 65535
MaxWord = 65535
MaxShortCard = 255
MaxByte = 255
MaxShort =127
MaxShortInt =127
Pi =3.14159265358979
4.) Typbezeichner
a) Boolean = (false,true)
b) Ganzzahltypen:
Integer = -32768.. 32767
Shortint = Short = -128.. 127
Longint = Long = -2147483648.. 2147483647
ShortCard = Bvie =()..255
Cardinal = Word = ü.. 65535
Char = chr(O).. chr(255)
Real
Text = FILE OF Char
Str
Ptr
MaxonPASCAl,
304
5.) Variablen
Input: text
Output: text
Sysbase: ptr Absolute 4
DosBase: ptr
MathBase: ptr
MathTransBase; ptr
FromWB: boolean
RarameterStr: str
ParameterLen: integer
StartupMessage: ptr
Mem : Array(O..MaxLongInt] Of Byte Absolute 0
6.) Prozeduren
AddExitServer (proc)
Assign (datei,nanie)
BlockRead (datei, variable, anzahl)
BlockWrite (datei, variable, anzahl)
Buffer (datei, bytes)
CBreak
ClrScr
ClrEol
Close (datei)
CloseConsole (devpointer)
CloseLib (libpointer)
Close_Screen (screenhandle)
Close_Window (windowhandle)
Dec (ordinalvar)
Delay (secs*50)
Delete (stringvar, pos, len)
DelLine
Dispose (pointer)
DisposeAll
Error (String)
Exchange (varl,var2)
Free Mem (adresse,grosse)
Get (datei)
GotoXY (x,y)
Inc (ordinalvar)
Insert (string,stringvar,pos)
InsLine New (pointer)
OpenLib (pointervar, name, version)
Rage ((datei)]
Put (datei)
Randomize
Read (readpararaeterlist)
ReadLN (readparameterlist)
Reply_Msg (msg pointer)
Reset (datei)
ReWrite (datei)
SetStdIO (consoleptr)
Val (String, numvar, intvar)
Write (writepararaeterlist)
WriteLN (writeparameterlist)
WriteCon (devpointer, string)
7.) Funktionen
Abs (numerisch): numerisch
Addr (var): Longint
AUoc_Mem (große,flags): Longint
ArcTan (x): Real
Break (n): Boolean
ehr (int): Char
Concat (strl, str2,...): String
Copy (string, pos, len): Longint
Cos (x): Real
Eof [(datei)]: Boolean
EoLN ((datei)]: Boolean
MaxonPASCAL
306
Exp (x): Real
FreeStack: Longint
Get_Msg (port): Ptr
Hi (i): Integer
IntStr (long): String
Length(string): Longint
Ln (x): Real
Lo (i): Integer
Odd (int): Boolean
OpenConsole (window): Ptr
Open Screen (x,y,breite höhe,tiefe,hfarb,vfarb,mode,name): Ptr
Open_Window(x,y,breite,höhe,färbe,IDCMP,flags,name,
screen,minw,niinh,maxw,maxh): Ptr
Ord (ordinal): Integer
Pos (strl, str2): Longint
Pred (ordinal): ordinal
PwrlO (int): Real
Random: Real
Random (i): Integer
ReadCon (devpointer): Char
RealStr (r,i): String
Round (x): Longint
Sin (x): Real
SizeOf (typ): Longint
Sqr (numerisch): numerisch
Sqrt (x): Real
StrLen (string): Integer
Succ (ordinal): ordinal
Swap (i): Integer
Upcase (ch): Char
Wait (maske): Long
Wait_Port (port): Ptr
Index
$link.1'»
$paih.1^*’
Aljhrechcn.-9
Abhiinpskdt. ü
.ta. Ii7
ABSOU ITE-Variablcn.93
Alispiden.M
AddExitScrver.Ki8
AilcIIDCMP.238
Acltlr.167
ALink.31, 196
Allocmii-m.128, 16(1
AND.113
Anhalten.63
Anspringen.21
■Anweisung-steil.löA
Arlx'itsspeicher.32
ArcTan.137
AKexx-Befehlc.39
ARcxx-Porl.37-38,81,28i
addtx.“16
addtxobj.iO
aimpile.39
ernirseripl.^1
exefile.90
gctinfu Make.90
getinfc) STATE.90
Info. 39
leavemk.39
loadmk.39
MAX(7NI>.ASCAL.22
newmk.39
iibjectfile.90
opaimp.39
opcnmake.90
opsys.39
Optiun results.nO
saveconf.90
save,se.ssion.90
SendAppCnmm.39
setnpt.90
ARexx-Sthniltstelle.37
.Argument-String.39
.Arrays.130, 139
.ASCU-Zeichen.192
.Assembler.!,..215
As.sembleiTmxlul..39
As,sign.143, 131-132
Auflösung wählen.71
Aufnehmen.63
Aufzählung.121,138
Auf/älilungs typen.121
Ausfiihren.21,29
Aus,schneiden.30
Aasschnittstypen.121,138
.Aaszcichnen.60
Autoindent.61
Auto-Save.72
Autoren.2
.Auttisave.33
BACKSPACE.99
BeginlO.297
Benutzerdefinierte .Menüs.73
Betriebssysterafunktinnen.1.39
Bezeichner.88,207
Binärtahlcn.113
Bünk.31.196
Block drucken.32
liltK-'k einiesen.32
Blockoperalionen
Cut, Cupy, Paste.99
Ein rucken.32
laden, Sixtlchem, Drucken.31
Spaltenblöcke.31
Umwandeln.32
BlockRead.199,136
BlotkWrite.149,1%
Blöcke.89
Bcxikmarks.60
Btxrlean.120,138
Break.169
Buffer.133
Byte.113
Cardinal.113
C.ASE.108,133
CBreak.163
Char.121,138
ehr.137
CU.93
Close.132
CloseConsole.162
Cltcselib.163
Close_Dcvlce.297
Close_Screen.162
Close_Wlndt)w.I6l
ClrEol.199
MaxonPASCAL
308
ClrScr.1^9
Compiler-Anweisungen.175
Compiler-Einstellungen.37
Compiler-Fehlermeldungen. .56
"Program“ expectcd.255
Absolut variables must get.249
Bttulean Expression expccted.249
Dranch tou far.249
Can not open mathieee.250
Can not write unit.250
Can'tcnpythisfile.250
Can' t create direaories.250
CASE necds an ordinal expresait)n250
Compiler stack overflow.250
Con not jump into a structure.250
Constant expectcd.250
DO expectcd.250
Double dcfinition.250
Double use of Idcntifier.250
Element type is too large.251
Error in string.251
Error while reading unit.251
Field identiricr expectcd.251
Eile expected.251
File Ls not of required Type.251
File must be VAR paranieters.251
File not found.251
Fllenamc expected.251
Filename tfX) long.251
FlLEOFFlLELs not allowed.251
First constant is higher than.251
FOR needs an ordinal type.251
Functions can rctum simple.252
Garbagc at end of prugram.252
Global pracedure wiihout.252
Identifier expeaed.252
Idcntifier nix defmed in that.252
1MPLE.MNTATION expected.252
Illegal assignment.252
Illegal type for textfile input.252
Illegal type for textfile output.252
Incompaiible parameterlists.252
Integer expression expected.253
Label expei'ted.253
label on wrong level.253
Laufeeitfehler
.Division by zeru.257
.Error in Case.258
.Error in CloseLib.258
.Can ■ t open xxx.library.257
.Exec error.258
.Freemem feiied.258
.Intuition error.258
.Out of memory.258
.Outof ränge.257
.Overflow error.258
.Suhscript out of ränge.257
.User Break.258
üb-base must be of Longlnt or... .253
Magic number docs not match.253
Memory overflow.253
Name tixr long.253
-Me free memnry for RSS-Hunk.253
Ne free memory for relncation.253
Ncsting overflow.253
No free memnry for bulTer.253
No free memory for unit.254
Numeric expression expefled.254
Offsets must be integer.254
Only global Prix'edures can.254
Ordinal Type expected.254
Out of ränge.254
Overflow at nesting of Incl-Iiles.254
Overflow in floating-point.254
Please set an unit directory.254
Please use „Round“ or „Trunc“.254
PROCEDERE or FUNCTION.254
Short Circuit of Units.255
Simple type expected.255
String exceeds line.255
String expression expected .255
String too long.255
Syntax error in Compiler dlrectivc.255
Temporary string can not get.255
THEN expected.255
These types can not be convened 255
This function identfier can not.255
This Preedure can not be used.256
To expected.256
Type conflict.256
Type conflict of Operands.256
Type expectcd.256
Type idcntifier expected.256
Type-free |x)inter must not.256
Unable tn 0(x.'n main flle.256
Unexpeoed end of source.256
Unit not found.256
Unknown identifier or Syntax.257
USES expected.257
Variable expected.257
Variable ixld address.257
Vi'lTü cxpects a variable nfa.257
Wrong Index type.257
Compiler-Schalter
.Arithmetischer Überlauf..32
Debugger-Datei.3.5
Indexbercich.32
Semikolon melden.32
Stackgrbße.32
Subrange testen.32
Unterbrechen.32
Compilermenüs. 24
Compiling.26
Concat.126,171
Configuration Icon.72
Copy.126,171
Copyrights und Warenzeichen.2
Cos.157
CrcatcElxtlO.246
CreatePnrt.246
CreateStdIO.246
Crt .235
CnCnnsole.241
CrtMessagc.239
CrtRastPort.240
CrtUserPon.241
CrtWinckiw.240
Datei.72
Datei speichern.295
Dateien.151
Uateloperationen
Laden.49
Speichern.48
Dateitypen.142
Datentypen.113
DbPwrlO.167
Debugger.34
Dec.171
DRF.177
Def-Datei laden.81
Delay.168
DELETE.44,172
DeleteExtlO.247
DeletePon.246
DeleteStdlO.246
Dell.ine.149
Direktiven.302
Display Beep.73
DISPOSE.128,159
DisposeAll.159
DO.107-108
Double.113,117
DOIXOTO.107-108
Drucke Zeilennummem.75
EBNE.85,104
EBNF-Darstellung.76
Editor.42
Editor-Fehlermeldungen
(ersvartet.300
) entartet.301
Alles ist rückgängig gemacht.293
Alles ist wiederhergestellt worden 293
Altes Pictogramm ersetzen.295
■Auflösungen nur im Bereich.298
.Automode-Bereich nur von.298
Cursor steht auf keinem.292
Datei existiert bereits.295
endif ohne if..299
Falsches Argument.301
Fehler beim Lesen.297
Funktion würde Einfaltung.291
Geänderten Text verwerfen.294
IDENTIFIER erwanet.300
Markierung gesetzt..290
Kann Datei nicht öffnen.296
Kann Info-Datei nicht speichern ...297
Kann nicht speichern.296
Kein Befehl.301
Kein Block definiert.291
Kein Pictogramm vorhanden.290
Kein Speicher mehr.294, 296
Konnte Backup nicht eizeugen.291
Konnte Datei nicht speichern.297
Konnte Formular nicht öffnen.297
flSToder IDENTIFIER erwartet.301
fVAL erwart et.301
Markierung nicht gesetzt.291
Menü ist zu groß fiir den Scrcen...293
NUMBER erwanet.300
Präprocessor-Befehl zu komplex .299
Präprozessor Befeh erwanet.299
Semikolon erwanet.301
STRING envartet.300
Strukturen stimmen nicht Überein293
Suchmuster nicht gefunden.292
Tabulatorweite nur zwischen.298
Text ist geschützt.290
TITUl erwanet.299
Wrap-Position darf nicht.297
Zeichenketc zu lang.292
MaxonPASCAL
310
Zeiten kleiner 30 Sek. machen.29R
Zu Wele .Argumente.301
Zu viele Menüeimräge.299
Zu viele Menütitel.300
Kditorkommandos.239
Again.270
AutriMtKie.283
BackSpace.260
IligStepDown.261
BigStepUp.261
BkxkHigher.269
BlockLiwcr.269
BlockSL.269
BltK'kSR.269
GoSuceFuld.273
GoSuccKey.273
GiituForm.280
Iconify.289
IndentReturn.261
InfuForin.281
InitTextRead.287
InsertChars.289
InsertFile.266
Jump.271
KillUne.260
Mark.267
MarkVert.267
Modil>OldCtnd.282
MuveDown.262
...262
...262
...261
...265
...264
...278
...266
...268
...283
...280
...268
...268
...277
...264
...278
...265
..279
..277
..277
..277
..288
..272
..271
..281
..270
..270
..261
..266
..268
..277
..262
..262
..264
....23
..274
..272
..272
Bot.263 .MoveLeft.
Gopy.268 .MoveRight.
Cut.267 MöveLIp.
Oeletc.260 New.
Display.282 NcwText.
ITo.282 NewWin.
F,ditFiirm.281 0|ien .
KndTextRead.288 OpcnClip.
EnterCmd.281 OpenlX*fs.
ExecCIi.289 PageFnrm.
ExecRexx.284 Paste.
FjiecRexxString.284 Pa.steVert.
Exit.279 PlayReeScript....
Find.270 PredText.
FindForm.280 PredWin.
FindRepForm.280 Print.
FokI.272 Quit.
Font.283 RecPlay.
FreeText.264 RerStan.
FreeWin...278 ReeStop..
FullSizeWin.279 ReDti.
(jetBkxklnfo.286 RemFokl...
GetUne.String.284 RemTab.
GetSereenlnfo.287 RepeatCmd.
GetTextlnfo.286 Replacc.
GeiTexthist.285 ReplareAll.
GetTextPri.s.285 Return.
GetWindowLlst.285 Save.
GetWord.284 SaveClip.
GlobalForm.280 SaveRecScript....
GoBi lükMark.274 ScreenDown.
GüDispPos.263 ScreenUp..
Go.MatchStruct.271 SelTextN.
GoParseError.271 SendAppComm
GiiPreclFnld.273 SetBonk.Mark....
GoPrcdKey.273 SetFi.ldsOff.
GiiStringPas.263 SetFoldsOn.
Index
311
.2R9
.275
.275
SetTab.
.275
SetWrap.
.275
.276
SetWrapOn.
.275
ShowFoki.
.272
Split Hor'Jl'in.
.279
SpliiVerWin.
.279
.204
SuccWin.
.278
.288
ToggleKcv.
.273
Top.
.263
.288
.260
.267
.276
WrapText.
.276
Edward.
.42
77
EinVAusgabcfehier.
.185
Einfügen.
.50
Einstellungen.
.70
ELSE.
....106,109,177
EniptylJT.
.150
Ende.
.69
ENDiF.
.177
Entferne Falte.
.59
EoF.
.150
Eüln.
.150
Error.
.168.178
Ersetzen.
.55
Erstelle Backup.
.73
.59
.170
Exe-Datei.
.33
Exit.
.169
EXP.
.119,157
.113
Expiinentiaklarstellung....
.119
EXPORT.
.204
external.
.204
.34
.llXi
Falsc.
.120
Falten.
.57
Falten überspringen.
.75
Farben .
.71
.26
.34
Feblermcidungen.
.41
Fehlerstellenansprung.
.41
Fenster
Erzeugen.
.65
Mit ,4nsicbten arbeiten.
.67
Scblieläen.
Wählen.
.36
Fertig.
.26
FlLEOFChar.
.142
.153
Filepos.
.154
Filcxsize.
.154
FlieKkomma-Coprozessor.
.117
.113
FontgröBe.
.71
.71
FOR.
.107
Form Feed.
.75
FORWARD.
.103,204
FPi:.
.117
Frac.
.167
.128
.165
Free Mem.
.161
FromWB.
.145
FUNCTION.
.101
Funktionen.93,101,147,305
ItiiR .
Ganzzahl.
.138
Ganzzahltyp.
.113
Gehe zu Fehler.
.56
.119
Get.
.143,152
Get Msg.
.164
Gleiipunkt 2 ahlen.
.117
GOTO.
.111
GotoXY.
.149
.53
.31
Halt.
.168
.31
Hi .
.166
.121
HolKev.
.69,81
Hunks.
.197
Iconily.
.69
MaxonPASCAL
Iriini meiigen. 33
IF .
.106 ,177
IMPLEMENTATION.,
.204
IMPORT.
.204
inc .
.170
Incl.
. 175
Indude.
.175
Indude-File.s.
. 188
Indudefiles.
. 175
Indexhereidi.
.181
Infdrmatiiin.
.30
Initialisierung.
. 209
Input.
.145
Insert.
.172
Insüne.
.149
Installation.
.IR
Integer.
.113
Interaktiv.
. 221
ImStr.
.173
lORe-sult.
.143, 153
ISÜ'Standard.
..102 109 14(1 l=;i
KeyDef..
.79
KcyPressed.
. 235
Keys.
.79
Klammern Einzug.
. 62
Kleinbuchstaben.
.
Kommandüzeilen-Interpretcr. 70
Kommentare.,.
. 88
Konfiguratioasdatei.
. 35
Konstanten.
. 90 ,145 303
Kopf.
.74
Kopieren.
.50
Label.
.90
Laden.
. 75
Laufzeit-Protokoll.
. 34
Laufzciifehlcr.
. 257
length.
.172
Lesezeidien.
. 60
Libraries.
. 186
Linker Error.
.26
Linker Rand.
. 75
Linkersteuerung.
.179 194
Linking.
.26
Literale.
. 139
Lizenzhc-dingungcn.
.3
LN .'L.''.
.119.158
Lu .
Long.
. 113
I.unglnt.
. 113
LongReal.
. 113 117
Main File.
. 31
Make...
.31,39,196,219
Make-rnits. 3 I
Makr(xs. 03
Manlisst.113
Markiea-n. 50
MathBase. 143
MalhlransBa.se .145
Mem.146
Menu. 77
MenuGroup. 77
Menultcm.78
McasageReceived..236
MiuleQualUst. 79
Mcxiule. 191 ,205
Näheningswen. 119
NamcOfPaigram.241
Neuer Flint. 71
NEW.128,159
NewUsi.246
Nev.'Win(liiw.I 39
NOT.115
Numeri,sche Tyiien. 113
Nummernixireidi. 75
Objektdatoi. 33
Objektdateien.I 94
Oiid.158
OpenConsole.162
OpenUb. 163
OpenScrecn.129
OpenWindriw.I 39
Open_Device.247
0|)en_Scrcen.161
Open_Windmv.160
Optiunen. 179
Optkinen sichern. 35
OR .115
Ord.158
OTHERWISE.109
OuiofMemriry.26
Outpul.145
Tage.149
Parameter. 97
ParamelerEen.34, 145
ParameterStr. 34 ,145
Piscal-Schlüsselwöner.302
PASCALCa.235
Path.176
Pfad.73
Puinier. 159
Pointenypcn.128
Pas.171
Pred.158
PROCEDURE.101
I’rogramnikupf.89
Profirammslart.28
Projekt & pjide.f'S
Projekte.212
Projekte erstellen.221
Projeklvcrwalfuns.219
.^hiinj'if’keiten.225
Datei werhseln.227
Dateien hinzufügen.224
Externe Übersetzung.2,40
I Itinrigemaehte .Maketlateicn.228
Interne Übersetzung.227
Internes Compilieren.229
Komnientiire.2.'11
Linkeraufruf.228
Make.22
inakefile.22
Makros.2.11
Projektpflege.226
Hegeln.212
ilhersetzen.224
Übersetzung erzwingen.226
Zeilenverbindung.2.10
Prozeduraufnif.Il)5
Prozeduren.93.147,304
Prozedurparameter.102
Prüfsumnien.210
Pseudo-Bezeichner.101
Put .143, 1S2
IVrlfl.Iii7
Quelltext-Veränderungen.28
QuotecIString.77
Random.165
Randntnize.166
Read.117, 148
RcadCon.162
ReadKey.235-2.36
Readhn.149
Real.113
RealStr.173
Realztthlen.113
Rechengenauigkeit.113, 118
Rechter Rand.62,75
RECORD-Typ.110
Records.130,1.39
Redii.82
REPFJ\T.107
Reply_.\1sg .164
Reset.143, 151
Rewrite.143, 152
Round.158
Rundungsfehler.119
Schachtel ung.206
Scriillhereirh.73
Seek.143,154
SeekEoF.150
SeekEoLN.150
Seitenforraai.74
Semikolon.88
SET.129
SetlDCMP.238
Set.Mtxle.79
SetStdIO.162,235
Sill.115
Short.113
Short-Cuts.70
ShortCard.113
Shonint.113
SHR.115
SIN.119,158
SizeOf.168
S|-)eldicrn.75
.Spezialsymbole.87
Sqr.158
SQRT.119,159
.Stacküberlauf.182
Standard-Units.235
Startu pMessage.145
STATIC.93,182
■Stantti-Anzeige.43
String-Konstanten.126
Stringbehandlting.171
Slringoptionen..36
Stringry[x;n.123
Strien.172
Stiuktur-Check.55
Strukturieren.57
Strukturkontrolle.56
SublDCMP.239
Suhnmge.180
Suce.159
Suchen.53,55
Supixin.2
Swap.166
.Symbole.87
Syntax.85,104,192
System.,30
.Systemeinstellungen.33
TAB in Space.s.61
TAB Weite.62
Temporärer String.126
MaxonPASCAL
314
Text
Auswahl.46
Daicken.47
ErTeugen.46
Freigeben.47
laschen.47
TextColms.241
Textdraw.73
Text Lines.241
THEN.106
Titelzeile.43
TO .108
Truc.120
Tninc.159
Typbezeichner.303
Typdeftnition.91
Typknnvertierungen.136
Überladung.118
Übersebreiben.61
Übersetze CRs.62
Llbersctzen.20
IJndefined Ty|X’.256
Undii.82
Undo Konfiguration.72
UndoUne.44
Unit.203
Units.191,201,205
Unterbrechen.29,181
UNTIl.107
Upease.166
IISES.203
Val .174
Variablen.145,198,304
Variablendeklaration.92
Variablenparameter.98
Variante.135
Veriiundanweisung.106
Verbundtyp.131
Vertauschen.55
Venikal einfügen.51
Vertikal markieren.51
Vorwort.17
Wait.163
WaitForKey.236
Wait_Pon.163
Wettzuweisung.105
WhereX.241
WhercY.241
VITOIE.107
Wildcard..54
WindnwClased.239
WindowTitles.241
WITH.110
Word.113
WordWrap.61
Word-Wrap.62
Workspace.32
Wnrkspace overflow.26
Wortsymbole.87
Write.117,147
WriteCon.162
Writeln.148
XOR.115
Zeichenkette.126
Zeige EOl.62
Zeige Falte.59
Zeige Spaces.62
Zeige TABS.61
Zeilen bis zum Text.74
Zeilen nach dem Text.74
Zeilen/Seite.74
Zeilen/'Tcxt. 75
Zeit.73
Zum Anfang.74
Zum Ende.75
PASCAL 3
rompllcr
• $cl;r schjieile TLir aaroundicitcn
• komfbrtabls Projckivenwllung (Make)
• (ürekier iyalsasielleniTspreng
• vdl in den Editor integntsi
• übe ARest-SchniiBtdlc steuerbar
• hdudes/Unia für AMIGA-OS o.l
•speicherbsier Progratnmstatiis
• kompilierte Programme sind auf allen
Amiga laufBhig (A500 • AAOOO)
• Unkfakig; ObjÄidateicn anderer Spra¬
che) we z.li Assembler, C'C".
MaxonllASIC oder Moduh können
daugebunden werden
• weitgehend kompatibel zu Borland
Turbo Pascal 5.0
Milor rEI)».SRÜ)
• .Multi-VfJndow-lfcdinik
• beliebig viele Tbiic gleichzeitig bear¬
beitbar (spelchcrabhänig)
• Falten von Texipassagen
• lasiatur und Menüfunkiionen frei
belegbar
• definierbare yjktos
•umfrmgreicbe UNDO-Möglichkelten
• .Autosave- und Backup-Modus
• speicherbarer Programmsiatus
•ARcw-Schnittsiclle
Hibliullii'kcn
• CRI'-UNIT (eigene Konsole. XeyPres-
sed. ReadKcy, VPaiiFotKey)
• PASCALCrt-UNIT (im Source)
• SVSTEM-'J.NTT (l’nii der System-Inclu-
de-Dateien des Amiga nut allen Dekla¬
rationen von Konstanten, Datentypen
u.nd library-Fjnktio.nen für den vollen
Zugriff auf das Betriebssystem)
Der neue PASCAL-Coinpiler
MaxonPASfbM. baüf auf dem Jen-
senAVtnh Standard auf, ist jedoch um
sehr viele leLstungsfähigc Funktionen
und Prozeduren erweitert worden.
Dies betrifft in erster Linie Datei-,
String- und .AMIGA-typische Funktio¬
nen.
Compiler linker
Compiler und Linker .sind voll in das
System integriert. Dadurch entläilen
sämtliche Nachladezeiteni Die Mög-
lldtkeit, alle benötigten Inciude-
Dateien 'ncim ersten Compifer-Lauf in
die RAM-Disk zu kopieren, erhöht die
Turnaround-Zelten enorm. Im Schnitt
compiliert das System 20.000 Zeilen
pro Minute.
Units
Eine der wichtigsten .Möglichkeiten
von MaxonPASCAl. ist das.üNlT-Kon-
zept. Es untersetzt ilen m.oduiaren
Aulbau von Programmen durch Ausla-
gern von Routinen. Die einzelnen
Quelltextc Ihrer Programme werden
dadurch kürzer und übersichtlicher.
Fertige Units werden vorcompillen
und bei weiteren Compilerläufen nur
noch dazugelinkt. Dies bringt einen
enormen Geschwindigkeitsgewinn.
Auch die AMIGA Sysiem-lndudes zu
AMIGA OS 3.1 werden als Uniis mit-
gdiefert.
AliilGA’
Eiasteiger und I msieigcr
MaxonP.ASC.AL ist das ideale System
für Einstdger und Umsteiger Zum
einen ist P.ASCAL die ideale Sprache
um das Programmieren zu erlernen
und zum anderer, ist .MaxonPjASCAL
der Compiler, der durch seine extrem
cinbiche Bedienung den Ein- oder
Umstieg sdir leicht macht
Includcs für OS 3-1
MaxonPASCAL bietet zudem den ein¬
fachen Zugriff auf die AMIGA-
Betriebssysiemfunktionen aller Ver¬
sionen bis zu OS 3.1. Die
entsprechenden Indudes und Units
werden mitgdiefert. Damit ist es
'-Jedem möglich, den AMIGA unter
allen verfügbaren Beinebssysiemen
wie ein Pro3 zu programmieren.
F.nvciierbar
MaxonPASCAl. Ist ein offenes System,
das Sie nach Bdicben erweitern kön¬
nen. Mögliche Zusätze sind z.B. das
Hilfesystem HOTHELP 3, der Assem¬
bler .MaxonASM oder Make.APP, ilas
Werkzeug zum mausgesteuerten
Eßtcllen von Programmoberfiachen.
Die SysicmvorausJHKen sind ein
■AMIGA (A500- .AfOOO^t mindestens
2 MB RAM. .A\UG.\-OS 1.3 bis 3.1 und
zwei Diskettenlaufwerken. Ein Fest-
plaitenlauhverk wird empfohlen
.MAXON CompuierGmbil * InüiLMricstr. Z6 mm
D-bSTbOEschborn • TcWonObiyt.A81811
Inmn»:ri.nd V.- fCOmpUfPr